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
相关产品推荐
相关产品推荐

