/**
 * Copyright 2014 Netflix, Inc.
 *
 * 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 com.netflix.spectator.perf;

import com.netflix.spectator.api.Counter;
import com.netflix.spectator.api.Spectator;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.TearDown;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

@State(Scope.Thread)
public class Counters {

  private final Counter cached = Spectator.registry().counter("cachedIncrement");

  @Benchmark
  public void cachedIncrement() {
    cached.increment();
  }

  @Benchmark
  public void lookupIncrement() {
    Spectator.registry().counter("lookupIncrement").increment();
  }

  @TearDown
  public void check() {
    final long cv = cached.count();
    final long lv = Spectator.registry().counter("lookupIncrement").count();
    assert cv > 0 || lv > 0 : "counters haven't been incremented";
  }

  public static void main(String[] args) throws RunnerException {
    Options opt = new OptionsBuilder()
        .include(".*")
        .forks(1)
        .build();
    new Runner(opt).run();
  }
}

@@ -889,16 +889,60 @@
 arDown;%0A
+import org.openjdk.jmh.annotations.Threads;%0A
 import o
@@ -1249,16 +1249,30 @@
 ent%22);%0A%0A
+  @Threads(1)%0A
   @Bench
@@ -1297,32 +1297,35 @@
  cachedIncrement
+_T1
 () %7B%0A    cached.
@@ -1342,16 +1342,30 @@
 );%0A  %7D%0A%0A
+  @Threads(1)%0A
   @Bench
@@ -1398,16 +1398,700 @@
 ncrement
+_T1() %7B%0A    Spectator.registry().counter(%22lookupIncrement%22).increment();%0A  %7D%0A%0A  @Threads(2)%0A  @Benchmark%0A  public void cachedIncrement_T2() %7B%0A    cached.increment();%0A  %7D%0A%0A  @Threads(2)%0A  @Benchmark%0A  public void lookupIncrement_T2() %7B%0A    Spectator.registry().counter(%22lookupIncrement%22).increment();%0A  %7D%0A%0A  @Threads(4)%0A  @Benchmark%0A  public void cachedIncrement_T4() %7B%0A    cached.increment();%0A  %7D%0A%0A  @Threads(4)%0A  @Benchmark%0A  public void lookupIncrement_T4() %7B%0A    Spectator.registry().counter(%22lookupIncrement%22).increment();%0A  %7D%0A%0A  @Threads(8)%0A  @Benchmark%0A  public void cachedIncrement_T8() %7B%0A    cached.increment();%0A  %7D%0A%0A  @Threads(8)%0A  @Benchmark%0A  public void lookupIncrement_T8
 () %7B%0A   

Add perf cases for multiple threads.