Time.now与Time.new在Ruby中

Pau*_*aul 3 ruby time datetime

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

Jef*_*ice 10

没有区别.

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

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


Sur*_*rya 5

now是别名new.它们之间没有区别.杰夫的价格得到回答(他的回答也是正确的,如果你愿意的话请投票给他答案)首先,因为我正在编写并运行这个基准:

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)
Run Code Online (Sandbox Code Playgroud)

自己运行基准:

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
Run Code Online (Sandbox Code Playgroud)

  • 基准测试将显示`new`和`now`之间没有任何有意义的区别,因为`now`是`new`的别名.任何差异都是由系统进程或垃圾收集引起的,并且基本上是在测试期间发生的随机噪声. (3认同)
  • @theTinMan:好的,我的坏,有点小.我在time.c中做了一些挖掘.我发现`now`实际上调用`rb_class_new_instance`而`new``time_init_0`(如果没有传递参数)创建当前时间并立即返回,而`rb_class_new_instance`向上移动到object.c,它最终分配了一个类的新对象,即它将调用`new`.所以,是的,它是一个别名,但它必须通过其他方法来达到实际的方法.我同意这不是一个令人担忧的话题.顺便说一句,谢谢你的意见.我总是从像你这样的人那里学到新东西.:) (2认同)