使用ASM統(tǒng)計(jì)一個(gè)方法執(zhí)行耗時(shí)

這個(gè)例子是:計(jì)算一個(gè)方法的耗時(shí),進(jìn)入方法時(shí)記錄時(shí)間,退出方法時(shí)計(jì)算時(shí)間差

public class MoonMethodVisitor extends AdviceAdapter {

    private int currentTimeVarIndex;//其實(shí)是一個(gè)編號(hào),給后面的load和store用

    public MoonMethodVisitor(MethodVisitor methodVisitor, final int access,
                             final String name,
                             final String descriptor) {
        super(Opcodes.ASM6, methodVisitor, access, name, descriptor);
    }

    @Override
    protected void onMethodEnter() {
        super.onMethodEnter();
      
        //這里相當(dāng)于 long currentTime = System.currentTimeMillis();
        currentTimeVarIndex = newLocal(Type.LONG_TYPE);//創(chuàng)建一個(gè)局部變量
        //INVOKESTATIC java/lang/System.currentTimeMillis ()J
        mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/System", "currentTimeMillis", "()J", false);
        mv.visitVarInsn(LSTORE, time);
    }

    @Override
    protected void onMethodExit(int opcode) {
        super.onMethodExit(opcode);
        //這里相當(dāng)于 System.out.println(System.currentTimeMillis() - currentTime);
        mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
        //INVOKESTATIC java/lang/System.currentTimeMillis ()J
        mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/System", "currentTimeMillis", "()J", false);
        //LLOAD 0
        mv.visitVarInsn(Opcodes.LLOAD, currentTimeVarIndex);
        //LSUB
        mv.visitInsn(Opcodes.LSUB);
        //INVOKEVIRTUAL java/io/PrintStream.println (J)V
        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(J)V", false);
    }
}
統(tǒng)計(jì)方法耗時(shí)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容