- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想做一些实时图形渲染,并尝试对每帧每个像素进行多次计算。然后我很快注意到这非常慢并且从最基础开始:我能以多快的速度循环所有像素?
我发现 dotime 相当快,但是当我在 REPL 中执行此操作时,速度非常慢:
user=> (dotimes [_ 10] (time (dotimes [_ 1e7] (+ 1 1))))
"Elapsed time: 409.177477 msecs"
"Elapsed time: 417.755502 msecs"
"Elapsed time: 418.939182 msecs"
"Elapsed time: 420.131575 msecs"
"Elapsed time: 419.83529 msecs"
"Elapsed time: 417.612003 msecs"
"Elapsed time: 420.749229 msecs"
"Elapsed time: 418.918554 msecs"
"Elapsed time: 414.403957 msecs"
"Elapsed time: 417.729624 msecs"
nil
user=>
然后我将其放入 Leiningen 项目中。当我做“lein run”时,速度也一样慢。但是当我创建 uberjar 并使用 java 命令运行它时,速度要快得多:
% java -jar target/looping-0.1.0-SNAPSHOT-standalone.jar
"Elapsed time: 122.006758 msecs"
"Elapsed time: 3.667653 msecs"
"Elapsed time: 3.60515 msecs"
"Elapsed time: 4.008436 msecs"
"Elapsed time: 3.961558 msecs"
"Elapsed time: 3.60212 msecs"
"Elapsed time: 3.592532 msecs"
"Elapsed time: 4.573949 msecs"
"Elapsed time: 3.959568 msecs"
"Elapsed time: 3.607495 msecs"
虽然第一次运行还是慢了很多。有什么不同?在这两种情况下,代码都是编译的,没有解释的 Clojure,对吗?是为 REPL 设置的 JIT、一些优化还是一些特殊的 JVM 选项?
感谢您的任何想法。
最佳答案
Leiningen 使用某些默认选项运行 JVM,这些选项可以缩短启动时间,但会损害运行时性能。因此,您可能需要再次检查将 :jvm-opts ^:replace []
添加到 project.clj
中。
除此之外,虽然下面没有添加任何内容来解释 REPL 和 überjar 之间的时间差异,但如果您关心准确的结果,我想我应该对基准测试发表评论:
time
并不是一个很好的基准测试工具,无论是否使用 dotimes
。 (没有dotimes
——JIT编译器不会启动;有dotimes
——它可能会启动,但很可能会决定循环体是一个空操作并优化它完全消失。)
雨果邓肯的 Criterium是强大的 Clojure 解决方案,负责 JIT 预热、以不会优化的方式循环以及结果的统计处理。一个简单的 Criterium 基准测试可能如下所示:
(require '[criterium.core :as c])
(def v [0 1 2])
(c/bench (nth v 0))
(这测量了访问 Var 中保存的短向量的初始元素的时间。我希望 (+ 1 1)
最终被编译为常量,因此可能有没有什么可以进行基准测试。)
关于performance - Clojure性能: REPL versus uberjar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20902479/
我有一个生成 jar 文件的 Maven 模块。我被要求开发其他几个 uberjar 文件 作为构建过程的副产品。我还被告知这 2 个 jar 文件是 applet jar 文件 将需要包含来自 ma
lein run,lein trampoline run和将clojure应用程序部署为uberjar有什么区别?性能上有区别吗? 如果我执行lein run/lein trampoline run,
我使用 maven-shade-plugin 进行构建,执行了 mvn-clean-package 并能够从目标目录中执行代码,如下所示:java -cp uber-weather-lookup-1.
我用 Clojure 构建了一个非常简单的网络应用程序(事实上,我遵循了一个教程)。 project.clj 文件如下所示: (defproject webdev "0.1.0-SNAPSHOT"
我使用 lein uberjar 创建应用程序的独立 jar。 执行时 java -jar dataloader-0.1.0-SNAPSHOT-standalone.jar, 它崩溃了: Caused
我正在使用“lein uberjar”为我的项目制作一个可执行的 jar 文件。 jar 已正确创建并按预期运行。 我只想知道是否可以不将我的源 .clj 文件包含在生成的 .jar 中,因为我打算分
我正在尝试使用 clojure Web 框架 noir 分发一个小型 Web 应用程序构建。当使用 lein run 运行时,它会按预期工作。当我运行 lein uberjar ,然后运行 jav
如何生成监听给定端口的独立环 uberjar ? 开发时,我使用以下 leiningen/ring 命令启动我的应用程序,我可以在其中指定端口: lein with-profile dev ring
我在 profile.clj 中定义了 :resource-paths 以包含一些特殊的 jar (vertica jdbc) 文件。然后我运行 lein uberjar: 尝试将该 jar 文件打包
我正在与 leiningen 和 Clojure 合作创建一个 uberjar,因此我有一个用于部署的文件。我还使用 leiningen 的默认资源路径嵌入了一些静态文件,其名称和数量因构建而异。有没
我已经研究这个有一段时间了,但我不得不问:现在不是可以通过 Eclipse 来完成吗?我找到了有关 Maven 和 Ant 的答案,但我从未使用过。如果我的输出 .jar 文件是一个可运行的 jar,
我正在尝试使用 Reflections 0.9.8 库,它以 uber-jar 的形式提供。如果我在项目的构建路径中添加它的 JAR(“reflections-0.9.8-uberjar”),那么 E
当以下 Clojure 示例程序被打包到一个独立的 uberjar 中(通过 boot-clj)时,java -jar app.jar 的执行行为不同于调用 -main 开发 repl 中的函数。 (
使用leiningen构建Clojure应用程序时,如何在使用lein uberjar时排除某些依赖被包含在JAR文件中? 最佳答案 使用 provided leiningen 个人资料的条目。 :
使用 leiningen 创建 uberjar 并使用 java -jar foo-uberjar.jar 运行该 jar 后程序运行良好,最后一行代码执行得相当快,但程序在关闭前挂了大约一分钟。这是
我有一个 Clojure“主”应用程序,它依赖于几个 Clojure 库,其中两个是我的。编译阶段,无论是编译还是运行uberjar都需要很长时间。至少需要一分钟或更长时间。我的图书馆和主要图书馆都不
从 uberjar 运行时,Ring 的文件响应对我不起作用。我都试过了 (response/file-response "index.html" {:root "resources/public"}
我想用不同的 main 创建许多 uberjars来自单个代码库的入口点。我看你可以指定main命名空间作为 lein uberjar 的参数但我没有看到指定结果文件名或路径的方法,因此它们只会相互覆
如何重命名和移动使用 SBT 程序集插件生成的 uberjar? addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.6") 我的 assembl
我想做一些实时图形渲染,并尝试对每帧每个像素进行多次计算。然后我很快注意到这非常慢并且从最基础开始:我能以多快的速度循环所有像素? 我发现 dotime 相当快,但是当我在 REPL 中执行此操作时,
我是一名优秀的程序员,十分优秀!