评论者: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))  
评估次数:60个样本中的21361228次调用,共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))
评估次数: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纳秒。