使用Java代理和byte-buddy来测量执行时间

时间:2017-12-16 07:24:52

标签: java performance agent byte-buddy

我正在尝试使用byte buddy lib为方法的度量执行时间创建一个java代理,而不更改main方法。我按照教程并创建以下代码。 执行此MonitorInspector时,必须给出执行时间。但它的工作效果不如下。

倍美

主类

我有什么方法可以解决这个问题。 请帮我减缓这个问题。

这是我的代码.. AgentTest(此代理代码)

public class SampleClass {

public static void main(String[] args) {
    System.out.println("Main Class");
    Methods.test(0);


}}

MonitorInspector

ServerValue.TIMESTAMP.toString();

主类

ServerValue.TIMESTAMP

2 个答案:

答案 0 :(得分:2)

您也可以使用Advice来实现这一点,class TimerAdvice { @Advice.OnMethodEnter static long enter() { return System.currentTimeMillis(); } @Advice.OnMethodExit(onException = Throwable.class) static void exit(@Advice.Origin String method, @Advice.Enter long start) { System.out.println(method + " took " + (System.currentTimeMillis() - start)); } } 使用代码内联,并且可以提高运行时性能:

new AgentBuilder.Default()
  .type(ElementMatchers.nameEndsWith("Timed"))
  .transform((builder, type, classLoader, module) -> 
      builder.visit(Advice.to(TimerAdvice).on(ElementMatchers.any()));
  );

并通过

应用建议
Visibility Opacity or jQuery FadeOut or Hide

这样,时间也不会出现在堆栈跟踪中。

答案 1 :(得分:1)

我找到了很好的解决方案,由Rafael Winterhalter给出。转到以下链接[ https://github.com/raphw/byte-buddy/issues/257]