[
https://issues.apache.org/jira/browse/RNG-79?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16784374#comment-16784374
]
Alex D Herbert commented on RNG-79:
-----------------------------------
The original benchmark tested methods with a linear sequence generator. This
was bad.
I have updated this to use a uniform random number generator.
I find the {{nextDouble}} methods are still all similar. The method to convert
to a float using bits is faster on this test machine:
||Method||Score||Error||Median||
|nextDoubleBaseline|313.53|0.32|313.54|
|nextDoubleUsingBitsToDouble|248.65|2.56|248.84|
|nextDoubleUsingMultiply52bits|249.69|2.14|249.97|
|nextDoubleUsingMultiply53bits|249.80|2.14|250.01|
|nextFloatBaseline|314.11|0.46|314.15|
|nextFloatUsingBitsToFloat|283.66|3.81|284.29|
|nextFloatUsingMultiply23bits|250.58|0.29|250.61|
|nextFloatUsingMultiply24bits|249.01|2.91|249.20|
Tested on:
* Ubuntu Linux 16.04 LTS using OpenJDK Runtime Environment (build
1.8.0_191-8u191-b12-2ubuntu0.16.04.1-b12).
* Intel(R) Xeon(R) CPU E5-1680 v3 @ 3.20GHz
> Benchmark methods for producing nextDouble
> ------------------------------------------
>
> Key: RNG-79
> URL: https://issues.apache.org/jira/browse/RNG-79
> Project: Commons RNG
> Issue Type: New Feature
> Components: core
> Affects Versions: 1.3
> Reporter: Alex D Herbert
> Assignee: Alex D Herbert
> Priority: Minor
> Time Spent: 50m
> Remaining Estimate: 0h
>
> Benchmark the speed of methods for producing a {{double}} from a {{long}}:
> {code:java}
> long v;
> double d1 = Double.longBitsToDouble(0x3FFL << 52 | v >>> 12) - 1.0;
> double d2 = (v >>> 12) * 0x1.0p-52d; // 1.0 / (1L << 52);
> double d3 = (v >>> 11) * 0x1.0p-53d; // 1.0 / (1L << 53);
> {code}
> Method d1 and d2 are both currently employed in the {{NumberFactory}}
> (makeDouble(int,int) and makeDouble(long)). However they suffer from
> producing a double whose least significant bit is always 0, i.e. they produce
> half of all possible double values from 0-1. This is discussed in the
> reference for the [XorShiRo generators|http://xoshiro.di.unimi.it/].
> This task will benchmark the methods using JMH. A switch to method d3 may be
> appropriate as it generates more values. This is the method employed in JDK
> 1.7 ThreadLocalRandom.
> A similar analysis can be made for producing a float:
> {code:java}
> int v;
> double f1 = Float.intBitsToFloat(0x7f << 23 | v >>> 9) - 1.0f;
> double f2 = (v >>> 9) * 0x1.0p-23f; // 1.0f / (1 << 23);
> double f3 = (v >>> 8) * 0x1.0p-24f; // 1.0f / (1 << 24)
> {code}
> Method f2 is currently used in the {{NumberFactory}}.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)