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

113
var timeInMs = Date.now();

por MDN

vs.

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

por MDN .

Existe alguma diferença entre os dois, além da sintaxe e a possibilidade de setar a Data (para não a atual) via opcional na segunda versão?

Date.now () é mais rápido - verifique o jsperf


fonte
54
para quem se importa, Date.now () não funciona em versões do Internet Explorer anteriores ao IE9. Eu mesmo não me importo
guido
8
Se valer a pena, você pode adicionar o shim de compatibilidade mencionado em developer.mozilla.org/en-US/docs/JavaScript/Reference/… para fazer Date.now () funcionar no IE <9 também.
jrajav de
jsben.ch/#/TOF9y
EscapeNetscape

Respostas:

105

Essas coisas são iguais ( edite semanticamente; o desempenho é um pouco melhor com .now()):

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

No entanto, o valor de tempo de qualquer Dateinstância já criada é congelado no momento de sua construção (ou em qualquer hora / data em que tenha sido definido). Ou seja, se você fizer isso:

var now = new Date();

e, em seguida, espere um pouco, uma chamada subsequente para now.getTime()informará a hora no ponto em que a variável foi definida.

Pontudo
fonte
Você acha que seria mais eficaz criar um objeto de data no início do programa e, em seguida, apenas atualizar esse objeto de data ( dateObj.setTime(Date.now())) ou criar novos objetos de data toda vez que você fizer algo assíncrono que precise acessar Datemétodos (como dateObj.getMinutes())?
doubleOrt
3
Os tempos de execução do JavaScript moderno do @Taurus são extremamente bons na criação de objetos e na coleta de lixo. A menos que você esteja trabalhando em algum tipo de kernel de jogo em tempo real, não há razão para se preocupar com isso. Escreva um código que tenha uma boa aparência e não seja frágil.
Pointy de
1
não devo dizer obrigado, mas obrigado (espero não ter feito isso mais de uma vez).
doubleOrt
57

Eles são efetivamente equivalentes, mas você deve usar Date.now(). É mais claro e cerca de duas vezes mais rápido.

Editar: Fonte: http://jsperf.com/date-now-vs-new-date

jrajav
fonte
1
É porque Date(optional).getTime();precisa alocar espaço para obter um novo objeto Date antes de obter a hora atual?
Charlie G
Provavelmente sim. Eu esperaria que isso tivesse mais a ver com tudo o que o construtor Date está fazendo do que com a alocação real do objeto.
jrajav de
Sim, eu adicionei isso rapidamente - quis dizer a alocação e tudo o que vem junto com a criação de um objeto.
Charlie G de
4

Ao fazer isso, (new Date()).getTime()você está criando um novo objeto Date. Se você fizer isso repetidamente, será cerca de 2x mais lento do que Date.now ()

O mesmo princípio deve ser aplicado para Array.prototype.slice.call(arguments, 0)vs[].slice.call(arguments, 0)

Gregory Magarshak
fonte
3

Sim, está correto; eles são efetivamente equivalentes ao usar a hora atual.

Brett Zamir
fonte
2

Às vezes, é preferível manter alguma variável de controle de tempo em um formato de objeto Date em vez de apenas alguns milissegundos, para ter acesso aos métodos de Date sem reinstanciar. Nesse caso, Date.now () ainda ganha sobre new Date () ou algo semelhante, embora apenas por cerca de 20% no meu Chrome e por uma pequena quantidade no IE.

Veja meu JSPERF em

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

vs.

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

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

SashaK
fonte