Skip to content

Instantly share code, notes, and snippets.

@franz1981
Created July 19, 2023 16:26
Show Gist options
  • Save franz1981/f40d3e7b70fb881d401b63103dbd6c98 to your computer and use it in GitHub Desktop.
Save franz1981/f40d3e7b70fb881d401b63103dbd6c98 to your computer and use it in GitHub Desktop.
package red.hat.puzzles.concurrent;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.infra.Blackhole;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.VarHandle;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLongFieldUpdater;
@State(Scope.Benchmark)
@Warmup(iterations = 10, time = 400, timeUnit = TimeUnit.MILLISECONDS)
@Measurement(iterations = 5, time = 200, timeUnit = TimeUnit.MILLISECONDS)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@BenchmarkMode(Mode.AverageTime)
@Fork(jvmArgs = "-XX:LoopUnrollLimit=1", value = 2)
public class StoreOps {
private static final AtomicLongFieldUpdater<StoreOps> VALUE_UPDATER = AtomicLongFieldUpdater.newUpdater(StoreOps.class, "updValue");
private static final VarHandle VALUE_HANDLE;
static {
try {
VALUE_HANDLE = MethodHandles.lookup().findVarHandle(StoreOps.class, "value", long.class);
} catch (ReflectiveOperationException e) {
throw new ExceptionInInitializerError(e);
}
}
// using int on purpose here
private static final int VALUE = 13;
private long value;
private volatile long updValue;
@Benchmark
public void updaterSetRelease() {
VALUE_UPDATER.lazySet(this, VALUE);
}
@Benchmark
public void vhSetRelease() {
VALUE_HANDLE.setRelease(this, VALUE);
}
}
@franz1981
Copy link
Author

perfnorm if very esplicit:

Benchmark                                           Mode  Cnt    Score   Error      Units
StoreOps.updaterSetRelease                          avgt   10    0.358 ± 0.007      ns/op
StoreOps.updaterSetRelease:CPI                      avgt    2    0.231          clks/insn
StoreOps.updaterSetRelease:IPC                      avgt    2    4.331          insns/clk
StoreOps.updaterSetRelease:L1-dcache-load-misses    avgt    2    0.001               #/op
StoreOps.updaterSetRelease:L1-dcache-loads          avgt    2    4.187               #/op
StoreOps.updaterSetRelease:L1-icache-load-misses    avgt    2   ≈ 10⁻⁴               #/op
StoreOps.updaterSetRelease:L1-icache-loads          avgt    2    0.003               #/op
StoreOps.updaterSetRelease:branch-misses            avgt    2   ≈ 10⁻⁴               #/op
StoreOps.updaterSetRelease:branches                 avgt    2    1.049               #/op
StoreOps.updaterSetRelease:cycles                   avgt    2    1.696               #/op
StoreOps.updaterSetRelease:dTLB-load-misses         avgt    2   ≈ 10⁻⁵               #/op
StoreOps.updaterSetRelease:dTLB-loads               avgt    2   ≈ 10⁻⁴               #/op
StoreOps.updaterSetRelease:iTLB-load-misses         avgt    2   ≈ 10⁻⁵               #/op
StoreOps.updaterSetRelease:iTLB-loads               avgt    2   ≈ 10⁻⁵               #/op
StoreOps.updaterSetRelease:instructions             avgt    2    7.342               #/op
StoreOps.updaterSetRelease:stalled-cycles-backend   avgt    2    0.002               #/op
StoreOps.updaterSetRelease:stalled-cycles-frontend  avgt    2    0.001               #/op
StoreOps.vhSetRelease                               avgt   10    8.641 ± 0.013      ns/op
StoreOps.vhSetRelease:CPI                           avgt    2    0.225          clks/insn
StoreOps.vhSetRelease:IPC                           avgt    2    4.442          insns/clk
StoreOps.vhSetRelease:L1-dcache-load-misses         avgt    2    0.009               #/op
StoreOps.vhSetRelease:L1-dcache-loads               avgt    2   74.030               #/op
StoreOps.vhSetRelease:L1-icache-load-misses         avgt    2    0.001               #/op
StoreOps.vhSetRelease:L1-icache-loads               avgt    2    0.046               #/op
StoreOps.vhSetRelease:branch-misses                 avgt    2    0.004               #/op
StoreOps.vhSetRelease:branches                      avgt    2   39.882               #/op
StoreOps.vhSetRelease:cycles                        avgt    2   39.013               #/op
StoreOps.vhSetRelease:dTLB-load-misses              avgt    2   ≈ 10⁻³               #/op
StoreOps.vhSetRelease:dTLB-loads                    avgt    2    0.002               #/op
StoreOps.vhSetRelease:iTLB-load-misses              avgt    2   ≈ 10⁻⁴               #/op
StoreOps.vhSetRelease:iTLB-loads                    avgt    2   ≈ 10⁻⁴               #/op
StoreOps.vhSetRelease:instructions                  avgt    2  173.284               #/op
StoreOps.vhSetRelease:stalled-cycles-backend        avgt    2    0.041               #/op
StoreOps.vhSetRelease:stalled-cycles-frontend       avgt    2    0.020               #/op

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment