Clojure表现:REPL与uberjar

 飛373227470 发布于 2023-02-06 19:00

我想做一些实时图形渲染,并尝试每帧每像素进行多次计算.然后我很快发现这很慢并且从最基础开始:我可以多快地遍历所有像素?

我发现dotimes的速度相当快,但是当我在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,对吧?是JIT,一些优化还是为REPL设置的一些特殊JVM选项?

谢谢你的任何想法.

1 个回答
  • Leiningen使用某些默认选项运行JVM,这些选项可缩短启动时间,但会影响运行时性能.所以,你可能想再次检查:jvm-opts ^:replace []添加到你的project.clj.


    除此之外,虽然下面没有添加任何解释REPL和überjar之间的时间差异的方法,但我认为如果你关心准确的结果,我会评论基准测试:

    time无论是否有基准测试,它都不是一个好的工具dotimes.(不dotimes- JIT编译器不会启动;有dotimes- 它可能会,但很可能决定循环的主体是noop并完全优化它.)

    Hugo Duncan的Criterium是强大的Clojure解决方案,负责JIT预热,以一种无法优化的方式进行循环,并对结果进行统计处理.一个简单的Criterium基准可能如下所示:

    (require '[criterium.core :as c])
    
    (def v [0 1 2])
    
    (c/bench (nth v 0))
    

    (这测量了访问Var中保存的短向量的初始元素的时间.我期望(+ 1 1)最终将其编译为常量,因此可能没有什么可用于基准测试.)

    2023-02-06 19:02 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有