From 3c6b840d6987747b7262b50d8c76ca52761dd3a7 Mon Sep 17 00:00:00 2001 From: Anubhaw Arya Date: Tue, 18 Feb 2020 15:04:46 -0800 Subject: [PATCH 1/4] Cache the result of toString in BigInteger --- .../java/datadog/opentracing/DDTracer.java | 2 +- .../opentracing/StringCachingBigInteger.java | 64 +++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 dd-trace-ot/src/main/java/datadog/opentracing/StringCachingBigInteger.java diff --git a/dd-trace-ot/src/main/java/datadog/opentracing/DDTracer.java b/dd-trace-ot/src/main/java/datadog/opentracing/DDTracer.java index 0ea58f151d..c006baac0f 100644 --- a/dd-trace-ot/src/main/java/datadog/opentracing/DDTracer.java +++ b/dd-trace-ot/src/main/java/datadog/opentracing/DDTracer.java @@ -716,7 +716,7 @@ public class DDTracer implements io.opentracing.Tracer, Closeable, datadog.trace // case BigInteger value; do { - value = new BigInteger(63, ThreadLocalRandom.current()); + value = new StringCachingBigInteger(63, ThreadLocalRandom.current()); } while (value.signum() == 0); return value; diff --git a/dd-trace-ot/src/main/java/datadog/opentracing/StringCachingBigInteger.java b/dd-trace-ot/src/main/java/datadog/opentracing/StringCachingBigInteger.java new file mode 100644 index 0000000000..19f040d7ac --- /dev/null +++ b/dd-trace-ot/src/main/java/datadog/opentracing/StringCachingBigInteger.java @@ -0,0 +1,64 @@ +package datadog.opentracing; + +import java.math.BigInteger; +import java.util.Random; + +/** + * Because we are using BigInteger for Trace and Span Id, the toString() operator may result in heavy + * computation and string allocation overhead. In order to limit this, we are caching the result + * of toString, thereby taking advantage of the immutability of BigInteger. + */ +public class StringCachingBigInteger extends BigInteger { + + private String cachedString; + + public StringCachingBigInteger(byte[] val, int off, int len) { + super(val, off, len); + } + + public StringCachingBigInteger(byte[] val) { + super(val); + } + + public StringCachingBigInteger(int signum, byte[] magnitude, int off, int len) { + super(signum, magnitude, off, len); + } + + public StringCachingBigInteger(int signum, byte[] magnitude) { + super(signum, magnitude); + } + + public StringCachingBigInteger(String val, int radix) { + super(val, radix); + } + + public StringCachingBigInteger(String val) { + super(val); + } + + public StringCachingBigInteger(int numBits, Random rnd) { + super(numBits, rnd); + } + + public StringCachingBigInteger(int bitLength, int certainty, Random rnd) { + super(bitLength, certainty, rnd); + } + + @Override + public String toString() { + if (cachedString == null) { + this.cachedString = super.toString(); + } + return cachedString; + } + + @Override + public boolean equals(Object o) { + return super.equals(o); + } + + @Override + public int hashCode() { + return super.hashCode(); + } +} From 4ee46882532b0d3e3df803d46c2b29d2c9d1b01b Mon Sep 17 00:00:00 2001 From: Anubhaw Arya Date: Tue, 18 Feb 2020 15:20:53 -0800 Subject: [PATCH 2/4] java 8 --- .../java/datadog/opentracing/StringCachingBigInteger.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/dd-trace-ot/src/main/java/datadog/opentracing/StringCachingBigInteger.java b/dd-trace-ot/src/main/java/datadog/opentracing/StringCachingBigInteger.java index 19f040d7ac..13ef479303 100644 --- a/dd-trace-ot/src/main/java/datadog/opentracing/StringCachingBigInteger.java +++ b/dd-trace-ot/src/main/java/datadog/opentracing/StringCachingBigInteger.java @@ -12,18 +12,10 @@ public class StringCachingBigInteger extends BigInteger { private String cachedString; - public StringCachingBigInteger(byte[] val, int off, int len) { - super(val, off, len); - } - public StringCachingBigInteger(byte[] val) { super(val); } - public StringCachingBigInteger(int signum, byte[] magnitude, int off, int len) { - super(signum, magnitude, off, len); - } - public StringCachingBigInteger(int signum, byte[] magnitude) { super(signum, magnitude); } From fc6c327705d784d4d3c46cea973ad63502603409 Mon Sep 17 00:00:00 2001 From: Anubhaw Arya Date: Tue, 18 Feb 2020 17:40:06 -0800 Subject: [PATCH 3/4] formatting --- .../java/datadog/opentracing/StringCachingBigInteger.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dd-trace-ot/src/main/java/datadog/opentracing/StringCachingBigInteger.java b/dd-trace-ot/src/main/java/datadog/opentracing/StringCachingBigInteger.java index 13ef479303..9f55278fde 100644 --- a/dd-trace-ot/src/main/java/datadog/opentracing/StringCachingBigInteger.java +++ b/dd-trace-ot/src/main/java/datadog/opentracing/StringCachingBigInteger.java @@ -4,9 +4,9 @@ import java.math.BigInteger; import java.util.Random; /** - * Because we are using BigInteger for Trace and Span Id, the toString() operator may result in heavy - * computation and string allocation overhead. In order to limit this, we are caching the result - * of toString, thereby taking advantage of the immutability of BigInteger. + * Because we are using BigInteger for Trace and Span Id, the toString() operator may result in + * heavy computation and string allocation overhead. In order to limit this, we are caching the + * result of toString, thereby taking advantage of the immutability of BigInteger. */ public class StringCachingBigInteger extends BigInteger { From 17b4fae39c88f7cf7f34bc9d8d97096e596f3583 Mon Sep 17 00:00:00 2001 From: Anubhaw Arya Date: Thu, 20 Feb 2020 12:00:28 -0800 Subject: [PATCH 4/4] Ignores for coverage --- dd-trace-ot/dd-trace-ot.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dd-trace-ot/dd-trace-ot.gradle b/dd-trace-ot/dd-trace-ot.gradle index 3d5772654e..5900c5f1fc 100644 --- a/dd-trace-ot/dd-trace-ot.gradle +++ b/dd-trace-ot/dd-trace-ot.gradle @@ -17,7 +17,8 @@ excludedClassesCoverage += [ 'datadog.trace.common.sampling.PrioritySampling', // This code is copied from okHttp samples and we have integration tests to verify that it works. 'datadog.trace.common.writer.unixdomainsockets.TunnelingUnixSocket', - 'datadog.trace.common.writer.unixdomainsockets.UnixDomainSocketFactory' + 'datadog.trace.common.writer.unixdomainsockets.UnixDomainSocketFactory', + 'datadog.opentracing.StringCachingBigInteger' ] apply plugin: 'org.unbroken-dome.test-sets'