簡體   English   中英

使用 Java 代理和字節伙伴測量執行時間

[英]Using Java agent and byte-buddy for measure execution time

我正在嘗試使用 byte buddy lib 創建一個 java 代理來測量方法的執行時間,而無需更改 main 方法。 我按照教程並創建以下代碼。 執行此 MonitorInspector 時必須給出執行所花費的時間。 但它不能只給出如下的輸出。

前衛

主班

有什么辦法可以解決這個問題。 請幫我減緩這個問題。

這是我的代碼.. AgentTest(這個代理代碼)

class AgentTest {

public static void premain(String arguments, Instrumentation ins) {
    System.out.println("Premain");
    new AgentBuilder.Default()
            .type(ElementMatchers.nameEndsWith("Timed"))
            .transform((builder, type, classLoader, module)->builder.method(ElementMatchers.any()).intercept(MethodDelegation.to(MonitorInterceptor.class))
            ).installOn(ins);
}}

監視器檢查器

class MonitorInterceptor {
@RuntimeType
public static Object intercept(@Origin Method method,@SuperCall Callable<?> callable) throws Exception {
    long start = System.currentTimeMillis();
    try {
        return callable.call();
    } finally {  System.out.println(method + " took " +(System.currentTimeMillis()-start));
    }}}

主班

public class SampleClass {

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


}}

您還可以通過使用代碼內聯的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()));
  );

這樣,時間也不會顯示在堆棧跟蹤中。

我找到了 Rafael Winterhalter 給出的很好的解決方案。轉到以下鏈接 [ https://github.com/raphw/byte-buddy/issues/257 ]

我在你的代碼中看到type(ElementMatchers.nameEndsWith("Timed")) ,可能是你的代碼行為的原因 4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM