评论由:claj_ 提供
在当前 rand(clojure 1.6.0)上的基准测试,$ java -version
java 版本 "1.7.0_51"
OpenJDK 运行环境(IcedTea 2.4.4)(7u51-2.4.4-0ubuntu0.13.10.1)
OpenJDK 64 位服务器 VM(构建 24.45-b08,混合模式)
:jvm-opts ^:replace [] (即不向 JVM 传递参数)
(bench (rand 10))
评估次数:1281673680次,来自21361228次调用中的60个样本。
平均执行时间:43.630075纳秒
执行时间标准差:0.420801纳秒
执行时间下四分位数:42.823363纳秒(2.5%)
执行时间上四分位数:44.456267纳秒(97.5%)
消耗的额外开销:3.194591纳秒
在60个样本中找到1个异常值(1.6667%)
轻度至严重 1(1.6667%)
异常值引起的变化:1.6389% 异常值略微增加方差
Clojure 1.7.0 主开发版本.
基准测试(rand 10)
评估次数:2622694860次,在60个样本中的43711581次调用。
平均执行时间:20.474605纳秒
标准偏差执行时间:0.248034纳秒
执行时间的下四分位数:20.129894纳秒(2.5%)
执行时间的上四分位数:21.009303纳秒(97.5%)
使用的开销:2.827337纳秒
在60个样本中找到2个异常值(3.3333%)
轻度至严重 2(3.3333%)
异常值引起的变化:1.6389% 异常值略微增加方差
在Clojure 1.6.0版本中也得到了类似的结果,并运行了几个不同但结果相似的测试。java.util.Random.nextInt 方法出奇地烂。ThreadLocalRandom版本的.nextInt 性能更好,但rand-int 函数可以接受负整数,这意味着对于 (.nextInt (ThreadLocalRandom/current) n) 的调用,会有一些参数转换问题,因为它需要上界和下界,而不是简单地用随机数 [0,1) 的乘积。
更改
(.nextDouble (ThreadLocalRandom/current)) 参数调用的速度非常快,但不能处理负参数。直接乘积的响应时间约为30纳秒。