使用ASM统计一个方法执行耗时

这个例子是:计算一个方法的耗时,进入方法时记录时间,退出方法时计算时间差

public class MoonMethodVisitor extends AdviceAdapter {

    private int currentTimeVarIndex;//其实是一个编号,给后面的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();
      
        //这里相当于 long currentTime = System.currentTimeMillis();
        currentTimeVarIndex = newLocal(Type.LONG_TYPE);//创建一个局部变量
        //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);
        //这里相当于 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);
    }
}
统计方法耗时
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容