_由: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位服务器虚拟机 (build 24.45-b08, 混合模式)
:jvm-opts ^:replace [] (即不向JVM提供参数)
(bench (rand 10))
评估次数:在21361228次调用中的60个样本,共有1281673680次。
平均执行时间: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))
评估次数:在60个样本中,共进行了43711581次调用,累计2622694860次。
平均执行时间: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纳秒。