_评论由: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))
评估次数:在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纳秒
执行时间的标准差: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 纳秒。