_由: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)) &
评估次数:60个样本中的21361228次调用,共1281673680次。
平均执行时间:43.630075 ns
执行时间标准差:0.420801 ns
执行时间下四分位数:42.823363 ns (2.5%)
执行时间上四分位数:44.456267 ns (97.5%)
占用的开销:3.194591 ns
在60个样本中发现了1个异常值(1.6667%)
轻度严重 1(1.6667%)
离群点方差:1.6389 % 离群点导致方差略有增加
Clojure 1.7.0-master-SNAPSHOT.
(bench (rand 10))
评估次数:2622694860,分布在60个样本中的43711581个调用。
平均执行时间:20.474605 ns
执行时间标准差:0.248034 ns
执行时间下四分位数:20.129894 ns(2.5%)
执行时间上四分位数:21.009303 ns(97.5%)
开销使用:2.827337 ns
在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纳秒。