Created
February 14, 2024 12:37
-
-
Save franz1981/345792006ae3446b96808ab0fa291a55 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 red.hat.puzzles.concurrent; | |
import org.openjdk.jmh.annotations.Benchmark; | |
import org.openjdk.jmh.annotations.BenchmarkMode; | |
import org.openjdk.jmh.annotations.CompilerControl; | |
import org.openjdk.jmh.annotations.Fork; | |
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.infra.Blackhole; | |
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; | |
@State(Scope.Benchmark) | |
@BenchmarkMode(Mode.AverageTime) | |
@OutputTimeUnit(java.util.concurrent.TimeUnit.NANOSECONDS) | |
@Fork(2) | |
@Measurement(iterations = 10, time = 200, timeUnit = java.util.concurrent.TimeUnit.MILLISECONDS) | |
@Warmup(iterations = 10, time = 200, timeUnit = java.util.concurrent.TimeUnit.MILLISECONDS) | |
public class UpdaterUtilsCost { | |
private static abstract class Updater<T> { | |
protected abstract AtomicIntegerFieldUpdater<T> updater(); | |
public void lazySet(T obj, int newValue) { | |
updater().lazySet(obj, newValue); | |
} | |
public void set(T obj, int newValue) { | |
updater().set(obj, newValue); | |
} | |
} | |
private static final AtomicIntegerFieldUpdater<UpdaterUtilsCost> F_UPDATER0 = AtomicIntegerFieldUpdater.newUpdater(UpdaterUtilsCost.class, "field0"); | |
private static final AtomicIntegerFieldUpdater<UpdaterUtilsCost> F_UPDATER1 = AtomicIntegerFieldUpdater.newUpdater(UpdaterUtilsCost.class, "field1"); | |
private static final AtomicIntegerFieldUpdater<UpdaterUtilsCost> F_UPDATER2 = AtomicIntegerFieldUpdater.newUpdater(UpdaterUtilsCost.class, "field2"); | |
private static final Updater<UpdaterUtilsCost> UPDATER0 = new Updater<UpdaterUtilsCost>() { | |
@Override | |
protected AtomicIntegerFieldUpdater<UpdaterUtilsCost> updater() { | |
return F_UPDATER0; | |
} | |
}; | |
private static final Updater<UpdaterUtilsCost> UPDATER1 = new Updater<UpdaterUtilsCost>() { | |
@Override | |
protected AtomicIntegerFieldUpdater<UpdaterUtilsCost> updater() { | |
return F_UPDATER1; | |
} | |
}; | |
private static final Updater<UpdaterUtilsCost> UPDATER2 = new Updater<UpdaterUtilsCost>() { | |
@Override | |
protected AtomicIntegerFieldUpdater<UpdaterUtilsCost> updater() { | |
return F_UPDATER2; | |
} | |
}; | |
@CompilerControl(CompilerControl.Mode.DONT_INLINE) | |
private void setViaFUpdater(AtomicIntegerFieldUpdater<UpdaterUtilsCost> updater, int value) { | |
updater.set(this, value); | |
} | |
@CompilerControl(CompilerControl.Mode.DONT_INLINE) | |
private void setViaUpdater(Updater<UpdaterUtilsCost> updater, int value) { | |
updater.set(this, value); | |
} | |
private volatile int field0; | |
private volatile int field1; | |
private volatile int field2; | |
@Benchmark | |
@CompilerControl(CompilerControl.Mode.DONT_INLINE) | |
public void updaterUtil(Blackhole bh) { | |
setViaUpdater(UPDATER0, 1); | |
bh.consume(field0); | |
setViaUpdater(UPDATER1, 1); | |
bh.consume(field1); | |
setViaUpdater(UPDATER2, 1); | |
bh.consume(field2); | |
} | |
@Benchmark | |
@CompilerControl(CompilerControl.Mode.DONT_INLINE) | |
public void fieldUpdaterUtil(Blackhole bh) { | |
setViaFUpdater(F_UPDATER0, 1); | |
bh.consume(field0); | |
setViaFUpdater(F_UPDATER1, 1); | |
bh.consume(field1); | |
setViaFUpdater(F_UPDATER2, 1); | |
bh.consume(field2); | |
} | |
@Benchmark | |
@CompilerControl(CompilerControl.Mode.DONT_INLINE) | |
public void updater(Blackhole bh) { | |
UPDATER0.set(this, 1); | |
bh.consume(field0); | |
UPDATER1.set(this, 1); | |
bh.consume(field1); | |
UPDATER2.set(this, 1); | |
bh.consume(field2); | |
} | |
@Benchmark | |
@CompilerControl(CompilerControl.Mode.DONT_INLINE) | |
public void fieldUpdater(Blackhole bh) { | |
F_UPDATER0.set(this, 1); | |
bh.consume(field0); | |
F_UPDATER1.set(this, 1); | |
bh.consume(field1); | |
F_UPDATER2.set(this, 1); | |
bh.consume(field2); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Results:
perfasm output: