_由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位服务器虚拟机(构建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-master-SNAPSHOT
(bench (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)。
变更
使用 `(ThreadLocalRandom/current) .nextDouble` 的参数非常快,但不能处理负参数。直接乘以随机数得到的速度大约是30纳秒。