通过 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 然而有些昂贵,特别是如果你经常查找它们并且没有很好的解决方法。
我目前正在使用 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 然而有些昂贵,特别是如果你经常查找它们并且没有很好的解决方法。