From b7098b5c487ad7281866ff8271351f9b0927d68a Mon Sep 17 00:00:00 2001 From: Diego Date: Fri, 5 Dec 2014 14:58:00 -0300 Subject: = core: introduce fastMod operation in Sampler --- kamon-core/src/main/scala/kamon/trace/Sampler.scala | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'kamon-core/src/main/scala/kamon/trace') diff --git a/kamon-core/src/main/scala/kamon/trace/Sampler.scala b/kamon-core/src/main/scala/kamon/trace/Sampler.scala index be6ace69..9c6e5e63 100644 --- a/kamon-core/src/main/scala/kamon/trace/Sampler.scala +++ b/kamon-core/src/main/scala/kamon/trace/Sampler.scala @@ -44,14 +44,27 @@ class RandomSampler(chance: Int) extends Sampler { } class OrderedSampler(interval: Int) extends Sampler { + import OrderedSampler._ + require(interval > 0, "kamon.trace.ordered-sampler.interval cannot be <= 0") + assume(interval isPowerOfTwo, "kamon.trace.ordered-sampler.interval must be power of two") private val sequencer = Sequencer() - def shouldTrace: Boolean = sequencer.next() % interval == 0 + def shouldTrace: Boolean = (sequencer.next() fastMod interval) == 0 def shouldReport(traceElapsedTime: NanoInterval): Boolean = true } +object OrderedSampler { + implicit class EnhancedInt(i: Int) { + def isPowerOfTwo = !((i & (i - 1)) == 0) + } + + implicit class EnhancedLong(dividend: Long) { + def fastMod(divisor: Int) = dividend & (divisor - 1) + } +} + class ThresholdSampler(thresholdInNanoseconds: Long) extends Sampler { require(thresholdInNanoseconds > 0, "kamon.trace.threshold-sampler.minimum-elapsed-time cannot be <= 0") -- cgit v1.2.3