2014-11-03 2 views
3

Есть ли разница между Time.now и Time.new (без параметров)? Может быть разница в управлении памятью или какие-то мелкие детали?Time.now vs. Time.new in Ruby

+0

Если вы были в курсе, что 'now' был псевдоним для' new', вы должны были сказать, так в этом вопросе, так как это помогло бы нам понять, что вы после. Я ожидаю, что вы знали, что, учитывая, что документ для [Time.new] (http://www.ruby-doc.org/core-2.1.4/Time.html#method-c-now) (v 2.1.4 в любом случае) состоит из одной строки: «Alias ​​for :: new». Возвращает объект Time, инициализированный текущим системным временем ». –

ответ

4

now является псевдонимом для new. Между ними нет никакой разницы. прибудете Джеффа Прайса ответить (и его ответ тоже правильно, пожалуйста, вверх голосовать свой ответ, если вам нравится это) первое, потому что я писал и работает этот тест:

рубин 2.1.2 (МРТ):

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 тест себя:

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 
+3

В тестах не будет значимой разницы между 'new' и' now', так как 'now' является псевдонимом' new'. Любые различия связаны с системными процессами или сбором мусора и представляют собой в основном случайный шум, который произошел во время теста. –

+1

@theTinMan: На самом деле, я провел тест примерно 5 раз за рубиновую версию, прежде чем публиковать ее здесь. Если разница была вызвана системными процессами или сборкой мусора или из-за любого случайного шума, который произошел во время теста, тогда результаты за время, затрачиваемое 'Time.new', не должны были быть значительно меньшими для всех 5 запусков. – Surya

+0

Я согласен, что эти компоненты действительно влияют на эталонный показатель, но не должны ли это влиять на него как на случаи, а не на предвзятость на «Time.new»? – Surya

9

Нет разницы.

Time.now - это псевдоним для :: нового. Возвращает объект Time, инициализированный до текущего системного времени.

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

+0

Для меня это не совсем то же самое во всех случаях ... '2.2.4: 010> Timecop.freeze (Chronic.parse (« February First »)) => 2017-02-01 12:00: 00 -0800' '2.2.4: 011> Time.now => 2017-02-01 12:00:00 -0800' ' 2.2.4: 012> Time.new => 2016-11-01 11:10:20 -0700' – nroose