Продуктивність - Date.now () проти Date.getTime ()


113
var timeInMs = Date.now();

на MDN

vs.

var timeInMs = new Date(optional).getTime();

за MDN .

Чи є різниця між цими двома, окрім синтаксису та можливістю встановити дату (не поточну) за допомогою необов'язкової у другій версії?

Date.now () швидше - перевірте jsperf


54
для тих, хто переймається, Date.now () не працює у версіях Internet Explorer раніше, ніж IE9. Мені самому байдуже
guideo

8
Для чого варто, ви можете додати прошивку сумісності, згаданого в developer.mozilla.org/en-US/docs/JavaScript/Reference/…, щоб Date.now () також працював на IE <9.
jrajav

Відповіді:


105

Ці речі однакові ( редагуйте семантично; продуктивність трохи краща .now()):

var t1 = Date.now();
var t2 = new Date().getTime();

Однак значення часу від будь-якого вже створеного Dateекземпляра заморожується на момент його створення (або в будь-який час / дату, на яку він встановлений). Тобто, якщо ви це зробите:

var now = new Date();

а потім зачекайте деякий час, наступний дзвінок now.getTime()вказуватиме час у точці, коли встановлена ​​змінна.


Як ви вважаєте, було б ефективніше створити один об'єкт дати в початковій програмі, а потім просто оновити цей об’єкт дати ( dateObj.setTime(Date.now())) або створити нові об’єкти дати щоразу, коли ви робите щось асинхронне, що потребує доступу до Dateметодів (таких як dateObj.getMinutes())?
подвійнийОкт

3
@Taurus сучасні умови роботи JavaScript надзвичайно хороші у створенні об'єктів та збору сміття. Якщо ви не працюєте над ядром гри в режимі реального часу, немає жодних причин турбуватися про це. Напишіть код, який виглядає добре і не тендітний.
Pointy

1
не повинен говорити спасибі, але дякую (сподіваюся, я не робив цього не один раз).
подвійнийОкт

57

Вони фактично рівноцінні, але вам слід скористатися Date.now(). Це зрозуміліше і приблизно вдвічі швидше.

Редагувати: Джерело: http://jsperf.com/date-now-vs-new-date


1
Це тому, Date(optional).getTime();що потрібно виділити простір, щоб отримати новий об'єкт Дата, перш ніж отримати поточний час?
Чарлі Г

Напевно, так. Я б очікував, що це має більше спільного з усім, що робить конструктор Date, а не з фактичним розподілом об'єкта.
jrajav

Так, я додав це поспішно - я мав на увазі розподіл і все, що йде разом зі створенням об'єкта.
Чарлі Г

4

Коли ви робите, (new Date()).getTime()ви створюєте новий об'єкт Дата. Якщо ви робите це повторно, це буде приблизно в 2 рази повільніше, ніж Date.now ()

Цей же принцип повинен застосовуватися і Array.prototype.slice.call(arguments, 0)проти vs[].slice.call(arguments, 0)


3

Так, це правильно; вони ефективно еквівалентні при використанні поточного часу.


2

Іноді бажано тримати деяку змінну часу відстеження у форматі об'єкта Date, а не лише декілька мілісекунд, щоб мати доступ до методів Date без повторної інстанції. У цьому випадку Date.now () все ще перемагає над новою Date () або подібним, хоча лише на приблизно 20% на моєму Chrome і на невелику суму в IE.

Дивіться мій JSPERF на

timeStamp2.setTime(Date.now()); // set to current;

vs.

timeStamp1 = new Date(); // set to current;

http://jsperf.com/new-date-vs-settime

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.