代码之家  ›  专栏  ›  技术社区  ›  Geo

在ruby中,如何以毫秒为单位计算运行时间?

  •  86
  • Geo  · 技术社区  · 16 年前

    如果我有 Time 对象来自:

    Time.now
    

    之后,我用同一行实例化另一个对象,我怎样才能看到多少毫秒已经过去了?第二个对象可以在同一分钟、在接下来的几分钟甚至几小时内创建。

    10 回复  |  直到 6 年前
        1
  •  118
  •   ezpz    16 年前

    如上所述,您可以操作 Time 对象,就好像它们是数值(或浮点)值一样。这些操作导致第二分辨率,可以很容易地转换。

    例如:

    def time_diff_milli(start, finish)
       (finish - start) * 1000.0
    end
    
    t1 = Time.now
    # arbitrary elapsed time
    t2 = Time.now
    
    msecs = time_diff_milli t1, t2
    

    你需要决定是否要截断它。

        2
  •  56
  •   phlipper    14 年前

    您可以通过以下方式向上面的解决方案添加一点语法糖:

    class Time
      def to_ms
        (self.to_f * 1000.0).to_i
      end
    end
    
    start_time = Time.now
    sleep(3)
    end_time = Time.now
    elapsed_time = end_time.to_ms - start_time.to_ms  # => 3004
    
        3
  •  26
  •   LowFieldTheory    11 年前

    我认为答案选错了,这个方法给出的是秒,而不是毫秒。

    t = Time.now.t­o_f
    => 1382471965.146
    

    这里我假设浮动值是毫秒

        4
  •  9
  •   Carl Smotricz    15 年前

    EZPZ的答案几乎是完美的,但我希望我能再多加一点。

    geo以毫秒为单位询问时间;这听起来像一个整数,我不会绕道浮点land。因此,我的方法是:

    irb(main):038:0> t8 = Time.now
    => Sun Nov 01 15:18:04 +0100 2009
    irb(main):039:0> t9 = Time.now
    => Sun Nov 01 15:18:18 +0100 2009
    irb(main):040:0> dif = t9 - t8
    => 13.940166
    irb(main):041:0> (1000 * dif).to_i
    => 13940
    

    乘以一个整数1000可以很好地保留小数,并且可能会更快。

    如果要处理日期和时间,可能需要使用 小精灵 班级。其工作原理类似,但换算系数为24*3600*1000= 八千六百四十万

    我发现约会时间 斯特林时间 斯特夫时间 在解析和格式化日期/时间字符串(例如到/从日志)方面非常有用的函数。有用的是:

    • 这些函数的格式化字符(h、%m、%s、…)与任何UNIX/Linux系统上的C函数几乎相同;并且

    • 还有一些:特别是, %L 毫秒!

        5
  •  9
  •   Steven Yue    9 年前

    要以毫秒为单位获得时间,最好添加 .round(3) ,因此在某些情况下会更准确:

    puts Time.now.to_f # => 1453402722.577573
    
    (Time.now.to_f.round(3)*1000).to_i  # => 1453402722578
    
        6
  •  6
  •   vyger    16 年前

    Time.now.to_f 可以帮助你,但它会返回秒。

    一般来说,当使用基准i时:

    • 输入变量当前时间;
    • 插入试块进行测试;
    • 输入变量当前时间,减去之前的当前时间值;

    这是一个非常简单的过程,所以我不确定你是不是真的问这个…

        7
  •  4
  •   arghtype Castaldi    8 年前

    %L 以红宝石表示毫秒

    require 'time'
    puts Time.now.strftime("%Y-%m-%dT%H:%M:%S.%L")
    

    puts Time.now.strftime("%Y-%m-%d %H:%M:%S.%L")
    

    将以毫秒为单位给出当前时间戳。

        8
  •  3
  •   mrueg    16 年前

    试着从第二次减去第一次。像这样:

    a = Time.now
    sleep(3)
    puts Time.now - a # about 3.0
    

    这给了您一个浮点数,即两次之间的秒数(加上毫秒数)。

        9
  •  1
  •   Ryan McGeary    6 年前
    DateTime.now.strftime("%Q")
    

    示例用法:

    >> DateTime.now.strftime("%Q")
    => "1541433332357"
    
    >> DateTime.now.strftime("%Q").to_i
    => 1541433332357
    
        10
  •  0
  •   Robert    7 年前

    答案是这样的:

    t_start = Time.now
    # time-consuming operation
    t_end = Time.now
    
    milliseconds = (t_start - t_end) * 1000.0
    

    然而, Time.now 接近风险是不准确的。我找到了卢卡·吉迪的帖子:

    https://blog.dnsimple.com/2018/03/elapsed-time-with-ruby-the-right-way/

    系统时钟是不断浮动的,它不只是向前移动。如果您对运行时间的计算是基于它的,那么您很可能会遇到计算错误,甚至 outages

    因此,建议使用 Process.clock_gettime 相反。类似于:

    def measure_time
      start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
      yield
      end_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
      elapsed_time = end_time - start_time
      elapsed_time.round(3)
    end
    

    例子:

    elapsed = measure_time do
        # your time-consuming task here:
        sleep 2.2321
    end
    
    => 2.232
    
    推荐文章