【问题标题】:Time.now vs Time.new in RubyRuby 中的 Time.now 与 Time.new
【发布时间】:2014-11-03 17:06:58
【问题描述】:

Time.nowTime.new(不带参数)之间有区别吗?可能是内存管理方面的差异或一些小细节?

【问题讨论】:

  • 如果您知道nownew 的别名,您应该在问题中这样说,因为这有助于我们了解您的目标。我希望您知道,考虑到 Time.new 的文档(无论如何是 v 2.1.4)由单行组成,“::new 的别名。返回一个初始化为当前系统时间的 Time 对象。”。

标签: ruby datetime time


【解决方案1】:

没有区别。

Time.now 是 ::new 的别名。返回一个初始化为的时间对象 当前系统时间。

http://www.ruby-doc.org/core-2.1.4/Time.html#method-c-now

【讨论】:

  • 对我来说,并不是所有情况都一样...2.2.4 :010 > Timecop.freeze(Chronic.parse("February First")) => 2017-02-01 12:00:00 -08002.2.4 :011 > Time.now => 2017-02-01 12:00:00 -08002.2.4 :012 > Time.new => 2016-11-01 11:10:20 -0700
  • @nroose Timecop 中的一个老错误? github.com/travisjeffery/timecop/issues/17
【解决方案2】:

nownew 的别名。他们之间没有区别。杰夫·普莱斯首先要回答(他的回答也是正确的,如果你喜欢这个,请投票给他的回答),因为我正在编写和运行这个基准测试:

Ruby 2.1.2(MRI):

Rehearsal ----------------------------------------------------------------------------
Time.new                                   0.670000   0.000000   0.670000 (  0.679709)
Time.now                                   0.880000   0.010000   0.890000 (  0.881899)
------------------------------------------------------------------- total: 1.560000sec

                                               user     system      total        real
Time.new                                   0.720000   0.000000   0.720000 (  0.719453)
Time.now                                   0.740000   0.010000   0.750000 (  0.742711)

Rehearsal ----------------------------------------------------------------------------
Time.new                                   0.810000   0.000000   0.810000 (  0.811874)
Time.now                                   0.830000   0.000000   0.830000 (  0.831346)
------------------------------------------------------------------- total: 1.640000sec

                                               user     system      total        real
Time.new                                   0.790000   0.010000   0.800000 (  0.800082)
Time.now                                   0.740000   0.000000   0.740000 (  0.749995)

Rehearsal ----------------------------------------------------------------------------
Time.new                                   0.680000   0.010000   0.690000 (  0.690337)
Time.now                                   0.850000   0.000000   0.850000 (  0.856800)
------------------------------------------------------------------- total: 1.540000sec

                                               user     system      total        real
Time.new                                   0.790000   0.010000   0.800000 (  0.792666)
Time.now                                   0.770000   0.000000   0.770000 (  0.777414)

Rehearsal ----------------------------------------------------------------------------
Time.new                                   0.590000   0.010000   0.600000 (  0.594650)
Time.now                                   0.710000   0.010000   0.720000 (  0.717067)
------------------------------------------------------------------- total: 1.320000sec

                                               user     system      total        real
Time.new                                   0.870000   0.000000   0.870000 (  0.872646)
Time.now                                   0.680000   0.010000   0.690000 (  0.687092)

Rehearsal ----------------------------------------------------------------------------
Time.new                                   0.780000   0.010000   0.790000 (  0.786419)
Time.now                                   0.780000   0.000000   0.780000 (  0.789049)
------------------------------------------------------------------- total: 1.570000sec

                                               user     system      total        real
Time.new                                   0.760000   0.010000   0.770000 (  0.768194)
Time.now                                   0.790000   0.010000   0.800000 (  0.790981)

自己运行基准测试:

n = 1000000

5.times do 
  Benchmark.bmbm(40) do |x|
    x.report("Time.new"){ n.times { Time.new } }
    x.report("Time.now"){ n.times { Time.now } }
  end
end

【讨论】:

  • 基准测试将显示newnow 之间没有有意义的差异,因为nownew 的别名。任何差异都是由于系统进程或垃圾收集造成的,基本上是测试期间发生的随机噪音。
  • @theTinMan :实际上,在将其发布到此处之前,我对每个 Ruby 版本运行了大约 5 次基准测试。如果差异是由于系统进程或垃圾收集或由于测试期间发生的任何随机噪声造成的,那么Time.new 所用时间的结果在所有 5 次运行中应该不会显着减少。
  • 我同意这些组件确实会影响基准,但这不应该影响这两种情况,而不是偏向于Time.new
  • 唯一的区别是now调用new。这是 C 中堆栈和子例程调用的非常非常小的构建和拆除。“......明显更小......”?在 1,000,000 次迭代中,您只能看到百分之几/秒的差异,在现实生活中,垃圾收集、I/O 和 OS 子系统将大大抵消这一差异。换句话说,它不值得担心并且相当于过早的优化。另请参阅bmbm 的文档。
  • @theTinMan :好吧,我的错,有点小。我在time.c中做了一些挖掘,我发现now实际上调用rb_class_new_instance,而newtime_init_0(如果没有传递参数)创建一个当前时间并立即返回,而rb_class_new_instance上升到 object.c,它最终分配了一个新的类对象,即它将调用new。所以,是的,它是一个别名,但它必须通过其他方法才能达到实际的别名。我同意这不是一个令人担忧的话题。顺便说一句,感谢您的投入。我总是从像你这样的人那里学到新东西。 :)
【解决方案3】:

使用 Ruby 2.4.1 和 Rails 5.0.3 在测试中使用 travel_to 时,Time.new 不会受到它的影响,但 Time.now 会因此而改变

【讨论】:

  • 这很可悲:(。但我认为我们必须避免在Time.now 的含义中使用Time.new。在这种情况下,我们会射出两个目标:)。 travel_to 的可读性和问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 2012-11-07
  • 2011-06-01
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
相关资源
最近更新 更多