_由 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。 l
平均执行时间: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。
(校验 (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)的上限和下限,而不是简单的乘法[0,1)的结果。
更改
参数(.nextDouble (ThreadLocalRandom/current))执行速度很快,但不能处理负数。直接乘法运算的速度大约为30纳秒。