You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@dubbo.apache.org by GitBox <gi...@apache.org> on 2018/09/05 03:55:13 UTC

[GitHub] lexburner opened a new issue #2444: [Enhancement] Replace Random with ThreadLocalRandom

lexburner opened a new issue #2444: [Enhancement] Replace Random with ThreadLocalRandom
URL: https://github.com/apache/incubator-dubbo/issues/2444
 
 
   ### Details
   
   A little change, replace `Random` with `ThreadLocalRandom` .
   
   Use of ThreadLocalRandom rather than shared Random objects in concurrent programs will typically encounter much less overhead and contention.
   
   Use of ThreadLocalRandom is particularly appropriate when multiple tasks .
   
   ### Benchmark
   
   There are some attentions need to be noticed before benchmark.
   
   1. third-party dependency need use carefully.
   2. bugs fix need to trace from upstream repository.
   3. performance benchmark
   
   I have compared the three cases : `Random`,`ThreadLocalRandom` from JDK, `ThreadLocalRandom` from netty.
   
   ```
   @BenchmarkMode({Mode.AverageTime})
   @OutputTimeUnit(TimeUnit.NANOSECONDS)
   @Warmup(iterations = 3, time = 5)
   @Measurement(iterations = 3, time = 5)
   @Threads(50)
   @Fork(1)
   @State(Scope.Benchmark)
   public class RandomBenchmark {
   
       Random random = new Random();
   
       @Benchmark
       public int random() {
           return random.nextInt();
       }
   
       @Benchmark
       public int threadLocalRandom() {
           return ThreadLocalRandom.current().nextInt();
       }
   
       @Benchmark
       public int nettyThreadLocalRandom() {
           return io.netty.util.internal.ThreadLocalRandom.current().nextInt();
       }
   
       public static void main(String[] args) throws RunnerException {
           Options opt = new OptionsBuilder()
                   .include(RandomBenchmark.class.getSimpleName())
                   .build();
   
           new Runner(opt).run();
       }
   
   }
   ```
   and below is our benchmark result under 50 concurrency
   ```
   Benchmark                               Mode  Cnt     Score      Error  Units
   RandomBenchmark.nettyThreadLocalRandom  avgt    3   160.321 ±   83.518  ns/op
   RandomBenchmark.random                  avgt    3  3281.972 ± 2093.187  ns/op
   RandomBenchmark.threadLocalRandom       avgt    3    91.505 ±   39.702  ns/op
   ```
   
   From the result we can know the truth
   > Both the performance (according to above benchmark) and the stability(it is from the JDK)
   > JDK 's ThreadLocalRandom looks good. 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services

---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@dubbo.apache.org
For additional commands, e-mail: notifications-help@dubbo.apache.org