From bcc45ed80d2b0b8e95eb4e81503b20b0301e87a4 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Thu, 14 May 2015 02:02:23 +0300 Subject: [PATCH] [HTRACE-170] Optimize use of Random in htrace-core ThreadLocalRandom is available since JDK7+ and it is faster than regular Random --- htrace-core/src/main/java/org/apache/htrace/Tracer.java | 3 ++- htrace-core/src/main/java/org/apache/htrace/impl/CountSampler.java | 5 ++--- htrace-core/src/main/java/org/apache/htrace/impl/MilliSpan.java | 3 ++- .../src/main/java/org/apache/htrace/impl/ProbabilitySampler.java | 4 ++-- htrace-core/src/test/java/org/apache/htrace/TraceCreator.java | 5 +++-- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/htrace-core/src/main/java/org/apache/htrace/Tracer.java b/htrace-core/src/main/java/org/apache/htrace/Tracer.java index b8c4c1a..9463f41 100644 --- a/htrace-core/src/main/java/org/apache/htrace/Tracer.java +++ b/htrace-core/src/main/java/org/apache/htrace/Tracer.java @@ -23,6 +23,7 @@ import org.apache.htrace.impl.MilliSpan; import java.util.List; import java.util.Random; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.ThreadLocalRandom; /** * A Tracer provides the implementation for collecting and distributing Spans @@ -30,10 +31,10 @@ import java.util.concurrent.CopyOnWriteArrayList; */ public class Tracer { public static final Log LOG = LogFactory.getLog(Tracer.class); - private final static Random random = new Random(); static long nonZeroRandom64() { long id; + Random random = ThreadLocalRandom.current(); do { id = random.nextLong(); } while (id == 0); diff --git a/htrace-core/src/main/java/org/apache/htrace/impl/CountSampler.java b/htrace-core/src/main/java/org/apache/htrace/impl/CountSampler.java index fe98916..be5063e 100644 --- a/htrace-core/src/main/java/org/apache/htrace/impl/CountSampler.java +++ b/htrace-core/src/main/java/org/apache/htrace/impl/CountSampler.java @@ -20,6 +20,7 @@ import org.apache.htrace.HTraceConfiguration; import org.apache.htrace.Sampler; import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; /** * Sampler that returns true every N calls. Specify the frequency interval by configuring a @@ -28,10 +29,8 @@ import java.util.Random; public class CountSampler implements Sampler { public final static String SAMPLER_FREQUENCY_CONF_KEY = "sampler.frequency"; - final static Random random = new Random(); - final long frequency; - long count = random.nextLong(); + long count = ThreadLocalRandom.current().nextLong(); public CountSampler(HTraceConfiguration conf) { this.frequency = Long.parseLong(conf.get(SAMPLER_FREQUENCY_CONF_KEY), 10); diff --git a/htrace-core/src/main/java/org/apache/htrace/impl/MilliSpan.java b/htrace-core/src/main/java/org/apache/htrace/impl/MilliSpan.java index c57eb25..1e90757 100644 --- a/htrace-core/src/main/java/org/apache/htrace/impl/MilliSpan.java +++ b/htrace-core/src/main/java/org/apache/htrace/impl/MilliSpan.java @@ -40,6 +40,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; /** * A Span implementation that stores its information in milliseconds since the @@ -60,10 +61,10 @@ public class MilliSpan implements Span { private Map traceInfo = null; private String processId; private List timeline = null; - private final static Random random = new Random(); private static long nonZeroRandom64() { long id; + Random random = ThreadLocalRandom.current(); do { id = random.nextLong(); } while (id == 0); diff --git a/htrace-core/src/main/java/org/apache/htrace/impl/ProbabilitySampler.java b/htrace-core/src/main/java/org/apache/htrace/impl/ProbabilitySampler.java index 3c08c84..e6e4894 100644 --- a/htrace-core/src/main/java/org/apache/htrace/impl/ProbabilitySampler.java +++ b/htrace-core/src/main/java/org/apache/htrace/impl/ProbabilitySampler.java @@ -22,6 +22,7 @@ import org.apache.htrace.HTraceConfiguration; import org.apache.htrace.Sampler; import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; /** * Sampler that returns true a certain percentage of the time. Specify the frequency interval by @@ -30,7 +31,6 @@ import java.util.Random; public class ProbabilitySampler implements Sampler { private static final Log LOG = LogFactory.getLog(ProbabilitySampler.class); public final double threshold; - private Random random = new Random(); public final static String SAMPLER_FRACTION_CONF_KEY = "sampler.fraction"; public ProbabilitySampler(HTraceConfiguration conf) { @@ -43,6 +43,6 @@ public class ProbabilitySampler implements Sampler { @Override public boolean next(Object info) { - return random.nextDouble() < threshold; + return ThreadLocalRandom.current().nextDouble() < threshold; } } diff --git a/htrace-core/src/test/java/org/apache/htrace/TraceCreator.java b/htrace-core/src/test/java/org/apache/htrace/TraceCreator.java index f79b01a..7ec6309 100644 --- a/htrace-core/src/test/java/org/apache/htrace/TraceCreator.java +++ b/htrace-core/src/test/java/org/apache/htrace/TraceCreator.java @@ -18,6 +18,7 @@ package org.apache.htrace; import java.util.Collection; import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; import org.apache.htrace.Sampler; import org.apache.htrace.SpanReceiver; @@ -80,7 +81,7 @@ public class TraceCreator { public void createThreadedTrace() { TraceScope s = Trace.startSpan(THREADED_TRACE_ROOT, Sampler.ALWAYS); try { - Random r = new Random(); + Random r = ThreadLocalRandom.current(); int numThreads = r.nextInt(4) + 1; Thread[] threads = new Thread[numThreads]; @@ -130,7 +131,7 @@ public class TraceCreator { public void run() { try { Thread.sleep(750); - Random r = new Random(); + Random r = ThreadLocalRandom.current(); int importantNumber = 100 / r.nextInt(3); System.out.println("Important number: " + importantNumber); } catch (InterruptedException ie) { -- 2.3.5