【发布时间】:2014-11-03 17:06:58
【问题描述】:
Time.now 和Time.new(不带参数)之间有区别吗?可能是内存管理方面的差异或一些小细节?
【问题讨论】:
-
如果您知道
now是new的别名,您应该在问题中这样说,因为这有助于我们了解您的目标。我希望您知道,考虑到 Time.new 的文档(无论如何是 v 2.1.4)由单行组成,“::new 的别名。返回一个初始化为当前系统时间的 Time 对象。”。
Time.now 和Time.new(不带参数)之间有区别吗?可能是内存管理方面的差异或一些小细节?
【问题讨论】:
now 是new 的别名,您应该在问题中这样说,因为这有助于我们了解您的目标。我希望您知道,考虑到 Time.new 的文档(无论如何是 v 2.1.4)由单行组成,“::new 的别名。返回一个初始化为当前系统时间的 Time 对象。”。
没有区别。
Time.now 是 ::new 的别名。返回一个初始化为的时间对象 当前系统时间。
【讨论】:
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
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)
自己运行基准测试:
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
【讨论】:
new 和now 之间没有有意义的差异,因为now 是new 的别名。任何差异都是由于系统进程或垃圾收集造成的,基本上是测试期间发生的随机噪音。
Time.new 所用时间的结果在所有 5 次运行中应该不会显着减少。
Time.new?
now调用new。这是 C 中堆栈和子例程调用的非常非常小的构建和拆除。“......明显更小......”?在 1,000,000 次迭代中,您只能看到百分之几/秒的差异,在现实生活中,垃圾收集、I/O 和 OS 子系统将大大抵消这一差异。换句话说,它不值得担心并且相当于过早的优化。另请参阅bmbm 的文档。
now实际上调用rb_class_new_instance,而newtime_init_0(如果没有传递参数)创建一个当前时间并立即返回,而rb_class_new_instance上升到 object.c,它最终分配了一个新的类对象,即它将调用new。所以,是的,它是一个别名,但它必须通过其他方法才能达到实际的别名。我同意这不是一个令人担忧的话题。顺便说一句,感谢您的投入。我总是从像你这样的人那里学到新东西。 :)
使用 Ruby 2.4.1 和 Rails 5.0.3 在测试中使用 travel_to 时,Time.new 不会受到它的影响,但 Time.now 会因此而改变
【讨论】:
Time.now 的含义中使用Time.new。在这种情况下,我们会射出两个目标:)。 travel_to 的可读性和问题。