java无锁提高性能_Java无锁性能JMH

我有一个JMH多线程测试:

@State(Scope.Benchmark)

@BenchmarkMode(Mode.Throughput)

@OutputTimeUnit(TimeUnit.MICROSECONDS)

@Fork(value = 1, jvmArgsAppend = { "-Xmx512m", "-server", "-XX:+AggressiveOpts","-XX:+UnlockDiagnosticVMOptions",

"-XX:+UnlockExperimentalVMOptions", "-XX:+PrintAssembly", "-XX:PrintAssemblyOptions=intel",

"-XX:+PrintSignatureHandlers"})

@Measurement(iterations = 5, time = 5, timeUnit = TimeUnit.SECONDS)

@Warmup(iterations = 3, time = 2, timeUnit = TimeUnit.SECONDS)

public class LinkedQueueBenchmark {

private static final Unsafe unsafe = UnsafeProvider.getUnsafe();

private static final long offsetObject;

private static final long offsetNext;

private static final int THREADS = 5;

private static class Node {

private volatile Node next;

public Node() {}

}

static {

try {

offsetObject = unsafe.objectFieldOffset(LinkedQueueBenchmark.class.getDeclaredField("object"));

offsetNext = unsafe.objectFieldOffset(Node.class.getDeclaredField("next"));

} catch (Exception ex) { throw new Error(ex); }

}

protected long t0,t1,t2,t3,t4,t5,t6,t7;

private volatile Node object = new Node(null);

@Threads(THREADS)

@Benchmark

public Node doTestCasSmart() {

Node current, o = new Node();

for(;;) {

current = this.object;

if (unsafe.compareAndSwapObject(this, offsetObject, current, o)) {

//current.next = o; //Special line:

break;

} else {

LockSupport.parkNanos(1);

}

}

return current;

}

}

>在目前的变体中,我有~55 ops / us的表现

>但是,如果我取消注释“特殊线”,或用unsafe.putOrderedObject(在任何方向 – current.next = o或o.next = current)替换它,性能~2 ops / us.

据我所知,这是CPU缓存发生的事情,也许它正在清理存储缓冲区.如果我将它替换为基于锁的方法,没有CAS,性能将是11-20 ops / us.

我尝试使用LinuxPerfAsmProfiler和PrintAssembly,在第二种情况下,我看到:

....[Hottest Regions]...............................................................................

25.92% 17.93% [0x7f1d5105fe60:0x7f1d5105fe69] in SpinPause (libjvm.so)

17.53% 20.62% [0x7f1d5119dd88:0x7f1d5119de57] in ParMarkBitMap::live_words_in_range(HeapWord*, oopDesc*) const (libjvm.so)

10.81% 6.30% [0x7f1d5129cff5:0x7f1d5129d0ed] in ParallelTaskTerminator::offer_termination(TerminatorTerminator*) (libjvm.so)

7.99% 9.86% [0x7f1d3c51d280:0x7f1d3c51d3a2] in com.jad.generated.LinkedQueueBenchmark_doTestCasSmart::doTestCasSmart_thrpt_jmhStub

有人可以向我解释一下究竟发生了什么?为什么这么慢?这里存储装载障碍?为什么putOrdered不起作用?以及如何解决它?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值