【问题标题】:How to get a meaningful result from subtracting 2 nanoTime objects?如何从减去 2 个 nanoTime 对象中获得有意义的结果?
【发布时间】:2022-02-04 11:31:59
【问题描述】:

我创建了一个过滤器来监控请求的长度。

long start = System.nanoTime();

...

long end = System.nanoTime();

我现在如何从中获取毫秒数?

【问题讨论】:

    标签: java performance nanotime


    【解决方案1】:
    (end - start) / 1000000
    

    1 微秒 = 1000 纳秒

    1 毫秒 = 1000 微秒

    请注意,结果将被四舍五入,但您通常不会获得真正的纳秒精度(精度取决于操作系统)。来自nanoTime() 上的 Javadoc:

    此方法提供纳秒级精度,但不提供 必须是纳秒级的精度。

    【讨论】:

    • 并且以防万一...精度大致意味着小数位数(数字 1.00000000000135738 具有很高的精度),而精度则说明了这些小数中有多少是正确的。例如,精度为 0.01 的 1.0001 可能介于 1.0101 和 0.9901 之间,而精度为 0.000001 的 1.0 保证介于 0.000009 和 1.000001 之间
    • 可以,但它返回的数字就像 10 或 5 而不是 10.234234234 或其他东西。我必须投吗?
    • @Blankman:如果你想得到一个像 10.234234234 这样的数字,你可以使用(end - start) / (double) 1000000(或者(end - start) / 1000000.,或者(end - start) / (float) 1000000,如果你想要浮动)
    • 因为 nanoTime 使用 64 位长,只有当您连续调用超过 292 年时才会发生溢出 (docs.oracle.com/javase/1.5.0/docs/api/java/lang/…)
    • @MichaelClerx 我想你的意思是在 0.999999 和 1.000001 之间。
    【解决方案2】:

    还请注意,您可以使用 TimeUnit 类来帮助进行转换。对于较旧版本的 Java,以下代码可能是将处理时间转换为其他时间格式的示例:

    long startTime = System.nanoTime();
    
    //Processing in-between.
    
    long endTime = System.nanoTime();
    long duration = endTime - startTime;
    duration = TimeUnit.SECONDS.convert(duration, TimeUnit.NANOSECONDS);
    

    请注意,较新版本的 Java 在 TimeUnit 类中有快捷方式。

    上面的示例会将纳秒长转换为秒。另请注意,这会截断它,因此您确实会失去一些精度。因此,如果您切换到分钟,那么您将失去秒的精度。如果您想获得“12 分 32 秒”的结果,则必须使用此解决方案进行进一步处理。

    【讨论】:

      【解决方案3】:

      TimeUnit#toMillis(long)

      TimeUnit.NANOSECONDS.toMillis(end - start);
      

      就是这样!

      【讨论】:

        【解决方案4】:

        只需减去它们并将结果除以 10^6。

        1 纳秒是 10^-9 秒,相应地是 10^-6 毫秒。
        http://en.wikipedia.org/wiki/Nano-

        【讨论】:

          【解决方案5】:

          你可以使用System.currentTimeMillis()

          警告:

          请注意,虽然返回值的时间单位是毫秒,但值的粒度取决于底层操作系统,可能更大。例如,许多操作系统以几十毫秒为单位测量时间。

          【讨论】:

            【解决方案6】:

            要获得有意义的结果:

            void procedure ( ... )
            {
                 ...
            }
            
            double measureProcedure ( double epsilon , ... )
            {
                double mean ;
                double stderr = 2 * epsilon ;
                while ( stderr > epsilon )
                {
                     long start = System.nanoTime();
                     procedure ( ... ) ;
                     long end = System.nanoTime();
                     // recalculate mean , stderr 
                }
                return ( mean / 1000000 ) ;
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-02-22
              • 2014-02-12
              • 2011-11-19
              • 2021-12-26
              • 1970-01-01
              • 2015-05-16
              • 2012-11-04
              • 2019-05-16
              相关资源
              最近更新 更多