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


quelle
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
jsben.ch/#/TOF9y
EscapeNetscape

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.

Spitze
quelle
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

jrajav
quelle
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)

Gregory Magarshak
quelle
3

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

Brett Zamir
quelle
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

SashaK
quelle