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

Java 通过Byte Buddy高效地整理每个线程的方法调用数?,java,byte-buddy,Java,Byte Buddy,我目前正在使用byte buddy添加一些简单的逻辑,以统计每个线程的方法调用总数 关于建议,我有以下几点建议: @Advice.OnMethodEnter static void handle() { MethodCounter.increment(); } 在MethodCounter#increment中,我有一个非常简单的ThreadLocal计数器,计数器本身只增加一个整数: public class MethodCounter { final ThreadLoc

我目前正在使用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 ...
}
公共类MethodCounter{
最终ThreadLocal threadCounter=新ThreadLocal();
公共静态无效增量(){
threadCounter.get().increment();
}
…和其他一些逻辑,确保为当前线程初始化计数器。。。
}
当使用JMH对这个新逻辑进行基准测试时,我注意到一个示例工作流(包含紧密循环)的性能下降了30%。大部分这似乎是由于
ThreadLocal
——如果我改用
ThreadLocal.get()
和硬编码
increment()
来增加静态
计数器,则对性能的影响最小


在保持每线程隔离的同时,是否有一种更有效的方法可以通过byte buddy实现这一点

一旦一个类被检测,Byte Buddy就真的不存在了


为了避免昂贵的本地线程,您可以尝试使用,它在线程的基础上使用并发映射,并且可以执行得更好。一般来说,线程本地程序有点昂贵,特别是如果你经常查找线程本地程序,并且没有好的解决方法的话

一旦一个类被检测,Byte Buddy就真的不存在了

为了避免昂贵的本地线程,您可以尝试使用,它在线程的基础上使用并发映射,并且可以执行得更好。一般来说,线程本地程序有点昂贵,特别是如果你经常查找线程本地程序,并且没有好的解决方法的话