_由: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,样本大小为60,每个样本调用21361228次。
平均执行时间: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) 的简单乘法。
更改:
(.nextDouble (ThreadLocalRandom/current) 参数) 非常迅速,但不能处理负参数。直接乘法的速度约为 30 纳秒。