Created
November 20, 2020 14:36
-
-
Save Palmr/0729b4c8b8f422487b3fd47d4cfe690b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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