Java 理解jmh中的不对称

Java 理解jmh中的不对称,java,performance,jvm,jmh,Java,Performance,Jvm,Jmh,我正在阅读JMH的基准测试,现在正在考虑 他们只是说: 到目前为止,所有测试都是对称的:在所有测试中都执行相同的代码 线。有时,您需要不对称测试 我需要这种对称的基准测试。我不了解该设施的任何实际使用案例。它们提供了以下内容: private AtomicInteger counter; @Setup public void up() { counter = new AtomicInteger(); } @Benchmark @Group("g") @GroupThreads(3)

我正在阅读JMH的基准测试,现在正在考虑

他们只是说:

到目前为止,所有测试都是对称的:在所有测试中都执行相同的代码 线。有时,您需要不对称测试

我需要这种对称的基准测试。我不了解该设施的任何实际使用案例。它们提供了以下内容:

private AtomicInteger counter;

@Setup
public void up() {
    counter = new AtomicInteger();
}

@Benchmark
@Group("g")
@GroupThreads(3)
public int inc() {
    return counter.incrementAndGet();
}

@Benchmark
@Group("g")
@GroupThreads(1)
public int get() {
    return counter.get();
}

但是你能给我一些真实世界的用例吗?我的意思是,我想不对称地衡量哪些方面?

编程加密是一个特定的用例:

对称密钥仅仅意味着加密数据的密钥与解密数据的密钥相同。非对称密钥意味着算法使用不同的密钥加密和解密数据

在性能是一个值得关注的问题的情况下,通过智能地使用安全选项,您可以帮助最小化WS-Security对性能的影响。某些web服务框架倾向于生成“上述所有”安全配置,使用WS-security对消息进行完全签名和加密,并通过SSL连接发送消息。如果您确实想要最大程度的保护,而不关心性能,那么这很好,但在大多数情况下,使用SSL(如果您只关心保护客户端和单个服务器之间传输的信息)或WS-Security加密更有意义(如果您需要跨多台服务器传送数据,同时在通过中介时保持机密性)

您还可以使用WS-SecureConversation在客户端和服务器之间进行长时间运行的消息交换(即使是通过中介访问的),与使用证书的WS-Security相比,获得了相对适中但显著的性能提升。WS-SecureConversation在交换相对较小的消息时尤其有效,与消息体的实际(对称)加密相比,证书和非对称加密的额外开销可能会更大

并发bug测试自动化是另一个用例:

最近提出了几种不同的方法 自动修复并发错误 解决因同步不足而导致的并发问题,包括原子性冲突、死锁和数据竞争。大体上说,在所有这些情况下,修复相当于插入额外的同步以抑制糟糕的交错场景

和多核优化:

为了优化性能,JVM在代码中使用“伪内存屏障”在跨多个处理器进行同步时充当围栏指令。可以恢复为“真实”内存屏障指令,但这可能会对性能产生明显(且不好)影响

参考资料


例如,典型的生产者-消费者或读者-作者场景。当测试只有在现实生活中执行其他操作时才有意义时,您需要它,而不是重复执行一个操作。例如,添加到队列中会随着队列的满满而变慢,但实际上队列通常可能是空的。@PeterLawrey我不太清楚用队列来理解你的例子。事实上,我们希望多线程来衡量上下文切换对性能的影响,这就是你的意思吗?但是对于Java的队列,它们是非阻塞的……那么我们希望通过这样一个基准来实现什么呢?@St.Antario假设线程不进行上下文切换,你仍然会在1到100毫秒内看到抖动范围。通过上下文切换,您可以看到1到100毫秒的抖动,这会产生影响。即使使用非阻塞策略也是如此。