001package io.prometheus.benchmark;
002
003import com.codahale.metrics.MetricRegistry;
004
005import java.util.concurrent.TimeUnit;
006import org.openjdk.jmh.annotations.BenchmarkMode;
007import org.openjdk.jmh.annotations.Mode;
008import org.openjdk.jmh.annotations.Benchmark;
009import org.openjdk.jmh.annotations.OutputTimeUnit;
010import org.openjdk.jmh.annotations.Scope;
011import org.openjdk.jmh.annotations.Setup;
012import org.openjdk.jmh.annotations.State;
013import org.openjdk.jmh.runner.Runner;
014import org.openjdk.jmh.runner.RunnerException;
015import org.openjdk.jmh.runner.options.Options;
016import org.openjdk.jmh.runner.options.OptionsBuilder;
017
018@State(Scope.Benchmark)
019public class CounterBenchmark {
020
021  MetricRegistry registry;
022  com.codahale.metrics.Counter codahaleCounter;
023  com.codahale.metrics.Meter codahaleMeter;
024
025  io.prometheus.client.metrics.Counter prometheusCounter;
026  io.prometheus.client.metrics.Counter.Child prometheusCounterChild;
027  io.prometheus.client.Counter prometheusSimpleCounter;
028  io.prometheus.client.Counter.Child prometheusSimpleCounterChild;
029  io.prometheus.client.Counter prometheusSimpleCounterNoLabels;
030
031  @Setup
032  public void setup() {
033    prometheusCounter = io.prometheus.client.metrics.Counter.newBuilder()
034      .name("name")
035      .documentation("some description..")
036      .build();
037    prometheusCounterChild = prometheusCounter.newPartial().apply();
038
039    prometheusSimpleCounter = io.prometheus.client.Counter.build()
040      .name("name")
041      .help("some description..")
042      .labelNames("some", "group").create();
043    prometheusSimpleCounterChild = prometheusSimpleCounter.labels("test", "group");
044
045    prometheusSimpleCounterNoLabels = io.prometheus.client.Counter.build()
046      .name("name")
047      .help("some description..")
048      .create();
049
050    registry = new MetricRegistry();
051    codahaleCounter = registry.counter("counter");
052    codahaleMeter = registry.meter("meter");
053  }
054
055  @Benchmark
056  @BenchmarkMode({Mode.AverageTime})
057  @OutputTimeUnit(TimeUnit.NANOSECONDS)
058  public void prometheusCounterIncBenchmark() {
059    prometheusCounter.newPartial().apply().increment();
060  }
061
062  @Benchmark
063  @BenchmarkMode({Mode.AverageTime})
064  @OutputTimeUnit(TimeUnit.NANOSECONDS)
065  public void prometheusCounterChildIncBenchmark() {
066    prometheusCounterChild.increment();
067  }
068
069  @Benchmark
070  @BenchmarkMode({Mode.AverageTime})
071  @OutputTimeUnit(TimeUnit.NANOSECONDS)
072  public void prometheusSimpleCounterIncBenchmark() {
073    prometheusSimpleCounter.labels("test", "group").inc(); 
074  }
075  
076  @Benchmark
077  @BenchmarkMode({Mode.AverageTime})
078  @OutputTimeUnit(TimeUnit.NANOSECONDS)
079  public void prometheusSimpleCounterChildIncBenchmark() {
080    prometheusSimpleCounterChild.inc(); 
081  }
082
083  @Benchmark
084  @BenchmarkMode({Mode.AverageTime})
085  @OutputTimeUnit(TimeUnit.NANOSECONDS)
086  public void prometheusSimpleCounterNoLabelsIncBenchmark() {
087    prometheusSimpleCounterNoLabels.inc(); 
088  }
089
090  @Benchmark
091  @BenchmarkMode({Mode.AverageTime})
092  @OutputTimeUnit(TimeUnit.NANOSECONDS)
093  public void codahaleCounterIncBenchmark() {
094    codahaleCounter.inc();
095  }
096
097  @Benchmark
098  @BenchmarkMode({Mode.AverageTime})
099  @OutputTimeUnit(TimeUnit.NANOSECONDS)
100  public void codahaleMeterMarkBenchmark() {
101    codahaleMeter.mark();
102  }
103
104  public static void main(String[] args) throws RunnerException {
105
106    Options opt = new OptionsBuilder()
107      .include(CounterBenchmark.class.getSimpleName())
108      .warmupIterations(5)
109      .measurementIterations(4)
110      .threads(4)
111      .forks(1)
112      .build();
113
114    new Runner(opt).run();
115  }
116}