Date.parse() vs new Date().getTime()

オブジェクトの配列を、各オブジェクトが文字列で持っている日付けでソートしようとし、Date.parse()を使って実装した。しかしもしかするとnew Date().getTime()の方が速いのではないかと調べていたら色々あった。結論としては今はDate.parse()がだいたい速いようだ。

以下は確認に使ったコードと実行結果だ。ランダムな日付けじゃないと正確な答えは出ないかと思ったがそうでもなかったので、この最初に書いたもので計った。

"use strict";

var i;
var dt = "2016-04-28T19:15:27+09:00";
var parse = "Date.parse(d)";
var gettime = "new Date(d).getTime()";

console.time(parse);

for (i = 0; i < 100000; i++) {
  Date.parse(dt);
}

console.timeEnd(parse);
console.time(gettime);

for (i = 0; i < 100000; i++) {
  new Date(dt).getTime();
}

console.timeEnd(gettime);

Node.js v6.0.0

Date.parse(d): 83.232ms
new Date(d).getTime(): 102.328ms

Node.js v6系では安定してparse()の方が速い。

Node.js v4.4.3

Date.parse(d): 130ms
new Date(d).getTime(): 31ms

Node.js v4系、つまり少し古いv8では異様にgetTime()の方が速い。今のLTS版であるv4.4.3で動かすスクリプトならgetTime()を使った方が良い……ということになりそうだが、何かのバグに基づいたまずい挙動であることも否めないため、意識しない方が無難だろう。

Chrome 50

Date.parse(d): 105.764ms
new Date(d).getTime(): 108.520ms

Firefox 46

Date.parse(d): 51.39ms
new Date(d).getTime(): 75.22ms

Edge 13

Date.parse(d): 79.165ms
new Date(d).getTime(): 149.825ms

Chrome 52

Date.parse(d): 95.232ms
new Date(d).getTime(): 128.391ms

Firefox 47

Date.parse(d): 55.51ms
new Date(d).getTime(): 89.19ms

Internet Explorer 11

Date.parse(d): 81.201ms
new Date(d).getTime(): 129.689ms

他の環境でも安定してparse()の方が速いようだ。Chrome 50だけ良い勝負だが、すぐに消えると考えられるので気にする必要はない。


jsPerfが死んでいて色々面倒だ。JSFiddleに置いたコードでブラウザーでは確認できる。