Skip to content

Instantly share code, notes, and snippets.

@Palmr
Created November 20, 2020 14:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Palmr/0729b4c8b8f422487b3fd47d4cfe690b to your computer and use it in GitHub Desktop.
Save Palmr/0729b4c8b8f422487b3fd47d4cfe690b to your computer and use it in GitHub Desktop.
package com.lmax.disruptor;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Group;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Warmup;
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;
import java.util.concurrent.TimeUnit;
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Fork(5)
public class FalseSharingCacheLinePaddingBenchmark
{
@State(Scope.Group)
public static class StateBaseline
{
long readOnly;
long writeOnly;
}
@Benchmark
@Group("baseline")
public long reader(StateBaseline s)
{
return s.readOnly;
}
@Benchmark
@Group("baseline")
public void writer(StateBaseline s)
{
s.writeOnly++;
}
@State(Scope.Group)
public static class StateSingleCacheLinePadding
{
private static final int CACHE_LINE_IN_LONGS = 64 / Long.BYTES;
private static final int ARRAY_SIZE_FOR_TWO_VALUES = CACHE_LINE_IN_LONGS * 2;
private static final int READ_VALUE_INDEX = 0;
private static final int WRITE_VALUE_INDEX = CACHE_LINE_IN_LONGS + 1;
long[] arr = new long[ARRAY_SIZE_FOR_TWO_VALUES];
}
@Benchmark
@Group("singleCacheLine")
public long reader(StateSingleCacheLinePadding s) {
return s.arr[StateSingleCacheLinePadding.READ_VALUE_INDEX];
}
@Benchmark
@Group("singleCacheLine")
public void writer(StateSingleCacheLinePadding s) {
s.arr[StateSingleCacheLinePadding.WRITE_VALUE_INDEX]++;
}
@State(Scope.Group)
public static class StateDoubleCacheLinePadding
{
private static final int CACHE_LINE_IN_LONGS = 64 / Long.BYTES;
private static final int ARRAY_SIZE_FOR_TWO_VALUES = CACHE_LINE_IN_LONGS * 4;
private static final int READ_VALUE_INDEX = 0;
private static final int WRITE_VALUE_INDEX = (CACHE_LINE_IN_LONGS * 2) + 1;
long[] arr = new long[ARRAY_SIZE_FOR_TWO_VALUES];
}
@Benchmark
@Group("doubleCacheLine")
public long reader(StateDoubleCacheLinePadding s) {
return s.arr[StateDoubleCacheLinePadding.READ_VALUE_INDEX];
}
@Benchmark
@Group("doubleCacheLine")
public void writer(StateDoubleCacheLinePadding s) {
s.arr[StateDoubleCacheLinePadding.WRITE_VALUE_INDEX]++;
}
public static void main(String[] args) throws RunnerException
{
Options opt = new OptionsBuilder()
.include(FalseSharingCacheLinePaddingBenchmark.class.getSimpleName())
.threads(Runtime.getRuntime().availableProcessors())
.build();
new Runner(opt).run();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment