Android 打印耗时

private static long startTime;

    // 用于结束计时,并计算与开始时间点之间的时间差(以毫秒为单位)
    public static void recordingTime() {
        if (startTime == 0) {
            startTime = System.nanoTime();
            Log.d("打印耗时", getStackTraceStr() + " 开始计时 0 ms");
            return;
        }
        long currTime = System.nanoTime();
        long duration = (currTime - startTime) / 1_000_000; // 转换为毫秒
        Log.d("打印耗时", getStackTraceStr() + " 耗时: " + duration + " ms");
        startTime = currTime;
    }

    // 如果你需要手动重置开始时间
    public static void resetStartTime() {
        startTime = 0;
    }

    // 用于结束计时,并计算与开始时间点之间的时间差(以毫秒为单位)
    public static void recordingTime(String message) {
        if (startTime == 0) {
            startTime = System.nanoTime();
            Log.d("打印耗时", getStackTraceStr() + message + " 开始计时 0 ms");
            return;
        }
        long currTime = System.nanoTime();
        long duration = (currTime - startTime) / 1_000_000; // 转换为毫秒
        Log.d("打印耗时", getStackTraceStr() + message + " 耗时: " + duration + " ms");
        startTime = currTime;
    }

Android利用ASM(字节码操作框架)监控方法耗时的步骤如下: 1. 添加ASM依赖库 在build.gradle文件中添加ASM依赖库: ```gradle dependencies { implementation 'org.ow2.asm:asm:9.1' } ``` 2. 编写ASM代码 使用ASM编写一个ClassVisitor,用于修改字节码,在方法的开头和结尾插入计时代码: ```java public class TimeClassVisitor extends ClassVisitor { public TimeClassVisitor(int api, ClassVisitor cv) { super(api, cv); } @Override public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, descriptor, signature, exceptions); if (!name.equals("<init>") && !name.equals("<clinit>")) { mv = new TimeMethodVisitor(api, mv, access, name, descriptor); } return mv; } static class TimeMethodVisitor extends MethodVisitor { private final String mName; private final String mDesc; private final Label mStartLabel = new Label(); private final Label mEndLabel = new Label(); public TimeMethodVisitor(int api, MethodVisitor mv, int access, String name, String desc) { super(api, mv); mName = name; mDesc = desc; } @Override public void visitCode() { super.visitCode(); mv.visitLabel(mStartLabel); mv.visitMethodInsn(INVOKESTATIC, "java/lang/System", "nanoTime", "()J", false); mv.visitFieldInsn(PUTSTATIC, "com/example/MyClass", "sStartTime", "J"); } @Override public void visitInsn(int opcode) { if ((opcode >= IRETURN && opcode <= RETURN) || opcode == ATHROW) { mv.visitLabel(mEndLabel); mv.visitMethodInsn(INVOKESTATIC, "java/lang/System", "nanoTime", "()J", false); mv.visitFieldInsn(GETSTATIC, "com/example/MyClass", "sStartTime", "J"); mv.visitInsn(LSUB); mv.visitFieldInsn(PUTSTATIC, "com/example/MyClass", "sStartTime", "J"); } super.visitInsn(opcode); } @Override public void visitMaxs(int maxStack, int maxLocals) { mv.visitMaxs(maxStack + 4, maxLocals); } } } ``` 3. 在应用中使用ASM代码 在应用中调用ASM代码,在Activity的onCreate方法中插入以下代码: ```java try { ClassReader cr = new ClassReader(getClass().getName()); ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); TimeClassVisitor tcv = new TimeClassVisitor(Opcodes.ASM7, cw); cr.accept(tcv, ClassReader.EXPAND_FRAMES); byte[] code = cw.toByteArray(); Class<?> clazz = defineClass(getClass().getName(), code, 0, code.length); clazz.newInstance(); } catch (Exception e) { e.printStackTrace(); } ``` 以上代码将读取当前Activity的字节码,使用TimeClassVisitor修改字节码,然后重新定义类并实例化,以便在方法中添加计时代码。 4. 打印方法耗时 在Activity的onDestroy方法中打印方法耗时: ```java Log.i("Time", "onCreate: " + (sStartTime / 1000000f) + "ms"); ``` 以上代码将打印onCreate方法的耗时,单位为毫秒。 通过以上步骤,就可以使用ASM监控方法耗时了。需要注意的是,ASM会修改字节码,可能会导致应用崩溃或出现其他问题,所以需要谨慎使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值