package org.jctools.jmh.counters;
import static org.jctools.counters.CountersFactory.createFixedSizeStripedCounterV6;
import static org.jctools.counters.CountersFactory.createFixedSizeStripedCounterV8;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.LongAdder;
import org.jctools.counters.FixedSizeStripedLongCounter;
import org.jctools.maps.ConcurrentAutoTable;
/**
* @author Tolstopyatov Vsevolod
*/
public class CountersFactory {
public enum CounterType {
AtomicLong,
LongAdder,
FixedSizeStripedV6,
FixedSizeStripedV8,
CAT
}
static Counter build(CounterType type, int stripes) {
switch (type) {
case AtomicLong:
return new AtomicLongCounter();
case LongAdder:
return new LongAdderCounter();
case FixedSizeStripedV6:
return new FixedSizeStripedCounter(createFixedSizeStripedCounterV6(stripes));
case FixedSizeStripedV8:
return new FixedSizeStripedCounter(createFixedSizeStripedCounterV8(stripes));
case CAT:
return new ConcurrentAutoTableCounter();
default:
throw new IllegalArgumentException();
}
}
// For consistent and fair benchmarking, always use counter as field
static class AtomicLongCounter extends Counter {
private final AtomicLong counter = new AtomicLong();
@Override
public void inc() {
counter.incrementAndGet();
}
@Override
public long get() {
return counter.get();
}
}
static class LongAdderCounter extends Counter {
private final LongAdder counter = new LongAdder();
@Override
public void inc() {
counter.increment();
}
@Override
public long get() {
return counter.sum();
}
}
static class FixedSizeStripedCounter extends Counter {
private final FixedSizeStripedLongCounter counter;
public FixedSizeStripedCounter(FixedSizeStripedLongCounter impl) {
counter = impl;
}
@Override
public void inc() {
counter.inc();
}
@Override
public long get() {
return counter.get();
}
}
static class ConcurrentAutoTableCounter extends Counter {
private final ConcurrentAutoTable counter;
public ConcurrentAutoTableCounter() {
counter = new ConcurrentAutoTable();
}
@Override
public void inc() {
counter.add(1);
}
@Override
public long get() {
return counter.get();
}
}
}