You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java耗时测量问题:Android游戏方法执行时长统计异常

解决Android函数耗时测量中内部方法耗时“超过”外部方法的问题

这个问题我在做Android游戏性能调优时也碰到过,核心原因其实是你用Double存储纳秒时间戳导致的精度丢失,咱们来一步步理清楚:

问题根源:Double的精度局限性

System.nanoTime()返回的是long类型的值,它可以精确表示纳秒级的时间(最多能覆盖约292年的纳秒数,完全满足你的游戏开发需求)。但Double类型的有效位数只有53位,当时间戳的数值很大时,纳秒级的细微差异会被“抹平”——简单说就是两个不同的long时间戳转成Double后,可能变成同一个值,或者计算差值时出现严重误差,这就会导致你看到的“内部方法耗时比外部方法还长”的诡异情况。

修复方案:改用long存储时间戳

把你的TimeLog类里的时间字段换成long类型,完全保留System.nanoTime()的精度,计算差值时就不会出错了。修改后的示例代码:

public class TimeLog {
    // 用long存储起始时间,避免精度丢失
    private final long startTime;

    public TimeLog() {
        // 实例化时记录当前纳秒时间
        startTime = System.nanoTime();
    }

    // 返回耗时的纳秒数,精确无误差
    public long end() {
        return System.nanoTime() - startTime;
    }

    // 可选:提供转毫秒的方法,方便阅读结果
    public double getElapsedMillis() {
        return (double) (System.nanoTime() - startTime) / 1_000_000.0;
    }
}

额外注意事项

  • 确保TimeLog的实例化和end()调用严格包裹你要测量的代码段,比如外部方法开头实例化,结尾调用end();内部方法同理,不要在中间插入无关的耗时操作。
  • 如果需要同时测量多个嵌套方法的耗时,建议用日志标记清楚层级,比如外部方法打[外部方法] 耗时:X ns,内部方法打[内部方法] 耗时:Y ns,这样更容易对比结果。

内容的提问来源于stack exchange,提问作者Lapo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:15:37