通过 Byte Buddy 有效地整理每个线程的方法调用数量?

Efficiently collating the number of method calls per thread via Byte Buddy?

我目前正在使用 byte buddy 添加一些简单的逻辑来计算每个线程的方法调用总数。

对于建议工具,我有一些类似的东西:

 @Advice.OnMethodEnter
 static void handle() {
   MethodCounter.increment();
 }

MethodCounter#increment中,我有一个非常简单的ThreadLocal计数器,计数器本身只是递增一个整数:

public class MethodCounter {
    final ThreadLocal<Counter> threadCounter = new ThreadLocal<Counter>();
    public static void increment() {
        threadCounter.get().increment();
    }

    ... and some other logic that ensures that the Counter is initialized for the current thread ...
}

当使用 JMH 对这个新逻辑进行基准测试时,我注意到示例工作流(包含紧密循环)中的性能下降了 30%。这大部分似乎是由于 ThreadLocal——如果我改为摆脱 ThreadLocal.get() 和硬编码 increment() 以增加静态 Counter,则对性能的影响最小.

有没有更高效的方法来使用 byte buddy 完成此操作,同时保持每个线程的隔离?

一旦检测到 class,Byte Buddy 就真的出局了。

为避免昂贵的本地线程,您可以尝试使用 weak lock free,它在线程基础上使用并发映射并且性能更好。一般来说,thread-locals 然而有些昂贵,特别是如果你经常查找它们并且没有很好的解决方法。