aboutsummaryrefslogtreecommitdiff
path: root/kamon-core-bench
diff options
context:
space:
mode:
authorDiego <diegolparra@gmail.com>2018-09-11 21:22:42 -0300
committerDiego <diegolparra@gmail.com>2018-09-11 21:22:42 -0300
commit3ca5064a72179290521d72d695a67b32e9bf3439 (patch)
tree85e5dcc90186439d228f83d7f65e848eb6753928 /kamon-core-bench
parent794fbf02664ac8c31072d8b955d897901f1f22e0 (diff)
downloadKamon-3ca5064a72179290521d72d695a67b32e9bf3439.tar.gz
Kamon-3ca5064a72179290521d72d695a67b32e9bf3439.tar.bz2
Kamon-3ca5064a72179290521d72d695a67b32e9bf3439.zip
Improvements in ThreadLocalStorage
Diffstat (limited to 'kamon-core-bench')
-rw-r--r--kamon-core-bench/src/main/scala/kamon/bench/ThreadLocalStorageBenchmark.scala81
1 files changed, 81 insertions, 0 deletions
diff --git a/kamon-core-bench/src/main/scala/kamon/bench/ThreadLocalStorageBenchmark.scala b/kamon-core-bench/src/main/scala/kamon/bench/ThreadLocalStorageBenchmark.scala
new file mode 100644
index 00000000..96588798
--- /dev/null
+++ b/kamon-core-bench/src/main/scala/kamon/bench/ThreadLocalStorageBenchmark.scala
@@ -0,0 +1,81 @@
+/* =========================================================================================
+ * Copyright © 2013-2018 the kamon project <http://kamon.io/>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language governing permissions
+ * and limitations under the License.
+ * =========================================================================================
+ */
+
+
+package kamon.bench
+
+import java.util.concurrent.TimeUnit
+
+import kamon.context.Storage.Scope
+import kamon.context.{Context, Key, Storage}
+import org.openjdk.jmh.annotations._
+
+@State(Scope.Benchmark )
+class ThreadLocalStorageBenchmark {
+
+ val TestKey: Key[Int] = Key.local("test-key", 0)
+ val ScopeWithKey: Context = Context.create().withKey(TestKey, 43)
+
+ val TLS: Storage = new OldThreadLocal
+ val FTLS: Storage = new Storage.ThreadLocal
+
+
+ @Benchmark
+ @BenchmarkMode(Array(Mode.AverageTime))
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ @Fork
+ def currentThreadLocal: Context = {
+ val scope = TLS.store(ScopeWithKey)
+ TLS.current()
+ scope.close()
+ TLS.current()
+ }
+
+ @Benchmark
+ @BenchmarkMode(Array(Mode.AverageTime))
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ @Fork
+ def fastThreadLocal: Context = {
+ val scope = FTLS.store(ScopeWithKey)
+ FTLS.current()
+ scope.close()
+ FTLS.current()
+ }
+}
+
+
+class OldThreadLocal extends Storage {
+ private val tls = new java.lang.ThreadLocal[Context]() {
+ override def initialValue(): Context = Context.Empty
+ }
+
+ override def current(): Context =
+ tls.get()
+
+ override def store(context: Context): Scope = {
+ val newContext = context
+ val previousContext = tls.get()
+ tls.set(newContext)
+
+ new Scope {
+ override def context: Context = newContext
+ override def close(): Unit = tls.set(previousContext)
+ }
+ }
+}
+
+object OldThreadLocal {
+ def apply(): OldThreadLocal = new OldThreadLocal()
+} \ No newline at end of file