【问题标题】:Java System.nanoTime() huge difference in elapsed timeJava System.nanoTime() 经过时间的巨大差异
【发布时间】:2011-02-16 23:55:00
【问题描述】:

我正在使用 android 小部件并检查两次 System.nanoTime() 调用之间的经过时间,而且这个数字很大。你如何用这个来衡量经过的时间?它应该是一秒钟的一小部分,而不是更多。谢谢

【问题讨论】:

  • 嗯...你知道纳秒是什么吗?

标签: java android nanotime


【解决方案1】:

一秒包含1,000,000,000纳秒,所以只要你的数字在那个范围内,就是合理的。

【讨论】:

    【解决方案2】:

    System.nanoTime()返回一个时间值,其粒度为纳秒;即 10-9 秒,如 javadoc 中所述。对System.nanoTime() 的两次调用之间相隔几分之一秒的差异必然是一个很大的数字。


    如果您想要一个更大粒度的时间度量,请考虑 System.currentTimeMillis() ... 或将纳秒值除以 10 的适当幂以适合您的应用程序。

    请注意,在 Android 平台上,有 3 个不同的系统时钟支持不同的“时间度量”;见SystemClock。如果您正在为 Android 平台明确编程,您应该阅读 javadoc 并决定哪种方法最适合您的工作。


    供您参考,“nano-”是国际单位制 (SI) 定义的标准前缀之一 - 请参阅 http://physics.nist.gov/cuu/Units/prefixes.html

    如果您真的认为“他们”弄错了并且“nano-”太小,您可以随时给 NIST 写一封信。我相信有人会欣赏它... :-)

    【讨论】:

    • Android 文档推荐SystemClock.uptimeMillis() 用于间隔计时。由于这是大多数内置函数所使用的,因此有强烈的动机让它在所有设备上得到很好的实现。请参阅SystemClock 中的讨论
    • 或 SystemClock.elapsedRealtime() as " .. 通用间隔计时的推荐基础"
    • 事实上,developer.android.com/reference/android/os/SystemClockcurrentTimeMillis()“应该只在与现实世界的日期和时间的对应很重要时使用,例如在日历或闹钟应用程序中。间隔或经过时间测量应该使用不同的时钟。”即elapsedRealtime().
    【解决方案3】:

    如果您想要分数形式,只需使用您的 value / 10^9,其中 value 是您在 nanoTime()s 中的差异。

    long nanoSeconds = 500000000;
    float seconds = nanoSeconds / 1000000000;
    
    Log.i("NanoTime", nanoSeconds + " ns is the same as " + seconds + " seconds");
    

    您的输出将是:

    07-27 11:35:47.196: INFO/NanoTime(14237): 500000000 ns is the same as 0.5 seconds
    

    【讨论】:

    • 10^9?那将是非常大的......代码示例是正确的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多