Leistung - Date.now () vs Date.getTime ()


113
var timeInMs = Date.now();

pro MDN

vs.

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

pro MDN .

Gibt es einen Unterschied zwischen den beiden, abgesehen von der Syntax und der Möglichkeit, das Datum (nicht auf das aktuelle) über optional in der zweiten Version einzustellen?

Date.now () ist schneller - sehen Sie sich den jsperf an


53
Für alle, die sich interessieren, funktioniert Date.now () in Internet Explorer-Versionen vor IE9 nicht. Es ist mir selbst egal
Guido

8
Für das, was es wert ist, können Sie den in developer.mozilla.org/en-US/docs/JavaScript/Reference/… erwähnten Kompatibilitäts-Shim hinzufügen , damit Date.now () auch auf IE <9 funktioniert.
Jrajav

Antworten:


105

Diese Dinge sind die gleichen ( semantisch bearbeiten ; Leistung ist etwas besser mit .now()):

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

Der Zeitwert einer bereits erstellten DateInstanz wird jedoch zum Zeitpunkt ihrer Erstellung eingefroren (oder zu welchem ​​Zeitpunkt / Datum auch immer). Das heißt, wenn Sie dies tun:

var now = new Date();

und dann eine Weile warten, ein nachfolgender Aufruf von now.getTime()zeigt die Zeit an dem Punkt an, an dem die Variable gesetzt wurde.


Denken Sie, dass es leistungsfähiger wäre, ein Datumsobjekt am Anfang des Programms zu erstellen und dann einfach dieses Datumsobjekt zu aktualisieren ( dateObj.setTime(Date.now())) oder jedes Mal neue Datumsobjekte zu erstellen, wenn Sie etwas Asynchrones tun, das auf DateMethoden zugreifen muss (z. B. dateObj.getMinutes())?
doubleOrt

2
Die modernen JavaScript-Laufzeiten von @Taurus eignen sich hervorragend für die Objekterstellung und Speicherbereinigung . Wenn Sie nicht an einem Echtzeit-Spielekernel arbeiten, gibt es überhaupt keinen Grund, sich darüber Sorgen zu machen. Schreiben Sie Code, der gut aussieht und nicht zerbrechlich ist.
Pointy

1
Ich soll nicht danke sagen, aber danke (ich hoffe, ich habe das nicht mehr als einmal gemacht).
DoubleOrt

57

Sie sind effektiv gleichwertig, aber Sie sollten verwenden Date.now(). Es ist klarer und ungefähr doppelt so schnell.

Bearbeiten: Quelle: http://jsperf.com/date-now-vs-new-date


1
Liegt das daran Date(optional).getTime();, dass Speicherplatz zugewiesen werden muss, um ein neues Datumsobjekt abzurufen, bevor die aktuelle Uhrzeit abgerufen werden kann?
Charlie G

Wahrscheinlich ja. Ich würde erwarten, dass es mehr mit allem zu tun hat, was der Date-Konstruktor tut, als mit der tatsächlichen Zuordnung des Objekts.
Jrajav

Ja, das habe ich schnell hinzugefügt - ich meinte die Zuordnung und alles, was mit dem Erstellen eines Objekts einhergeht.
Charlie G

4

Wenn Sie dies tun (new Date()).getTime(), erstellen Sie ein neues Datumsobjekt. Wenn Sie dies wiederholt tun, ist es ungefähr 2x langsamer als Date.now ()

Das gleiche Prinzip sollte für Array.prototype.slice.call(arguments, 0)vs.[].slice.call(arguments, 0)


3

Ja, das ist richtig; Sie sind effektiv gleichwertig, wenn die aktuelle Zeit verwendet wird.


2

Manchmal ist es vorzuziehen, eine Zeiterfassungsvariable in einem Date-Objektformat zu behalten, anstatt nur eine Anzahl von Millisekunden, um auf die Methoden von Date zuzugreifen, ohne sie erneut zu instanziieren. In diesem Fall gewinnt Date.now () immer noch über neues Date () oder ähnliches, allerdings nur um etwa 20% auf meinem Chrome und um einen winzigen Betrag auf IE.

Siehe meine JSPERF auf

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

vs.

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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.