_由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 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纳秒
执行时间标准差: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版本的性能较好,但rand-int可以接受负整数,这可能需要在(.nextInt (ThreadLocalRandom/current) n)中做一些参数转换,因为它需要上界和下界而不是简单的随机数[0,1)的乘积。
修改
(.nextDouble (ThreadLocalRandom/current) 参数)运行非常快,但不能处理负数参数。简单的乘法运算速度大约为30纳秒。