◆ やっぱり速い
◆ Chrome も早い
◆ IE だめ 

そういえば C# って中間言語とはいえコンパイルしてます
それならやっぱり JavaScript よりは速度は速いはず
でもどれくらい速いの?
ということで簡単に試してみました

JavaScript の for と forEach みたいに foreach と ForEach で大きく差があるのかも気になったのでそのあたり使ってます

コンパイル段階で値が決まるみたいなことにならないように時間をつかいました
for でリストに 100000 回現在時刻を追加して 各方法で差分を足し算してます
足し算の結果は 100000 回時刻を保存するのにかかった時間で全部で同じ値のはず
各方法の前後で時間計測して表示してます

時刻表示の timer は自作ですがあんまり重要じゃないので省略です

方法は
  • 自作 forEach メソッド (IEnumerable<T> の拡張メソッド foreach 構文で引数呼び出すだけ)
  • ForEach メソッド
  • Sum メソッド (足し算するならこれでいいかも)
  • foreach 構文

の4つです
var a = new List<DateTime>();

for (int i = 0; i < 100000; i++)
{
    a.Add(DateTime.Now);
}

var a1 = 0.0;
var p1 = a.First();
var a2 = 0.0;
var p2 = a.First();
var a3 = 0.0;
var p3 = a.First();
var a4 = 0.0;
var p4 = a.First();

timer.add("start");

a.forEach(x =>
{
    a1 += (x - p1).TotalMilliseconds;
    p1 = x;
});

timer.add("1");

a.ForEach(x =>
{
    a2 += (x - p2).TotalMilliseconds;
    p2 = x;
});

timer.add("2");

a3 = a.Sum(x =>
{
    var ret = (x - p3).TotalMilliseconds;
    p3 = x;
    return ret;
});

timer.add("3");

foreach (var x in a)
{
    a4 += (x - p4).TotalMilliseconds;
    p4 = x;
}

timer.add("4");

Console.WriteLine($"{a1}  {a2}  {a3}  {a4}");
timer.show();
5.9988  5.9988  5.9988  5.9988
20:36:31:661269 (+0 sec) start
20:36:31:665788 (+0.0045187 sec) 1
20:36:31:668289 (+0.0025015 sec) 2
20:36:31:675800 (+0.0075111 sec) 3
20:36:31:676801 (+0.0010004 sec) 4

6.0593  6.0593  6.0593  6.0593
20:37:14:030334 (+0 sec) start
20:37:14:033849 (+0.0035147 sec) 1
20:37:14:035845 (+0.0019967 sec) 2
20:37:14:043295 (+0.00745 sec) 3
20:37:14:044295 (+0.0009996 sec) 4

5.553  5.553  5.553  5.553
20:37:21:690126 (+0 sec) start
20:37:21:693076 (+0.0029496 sec) 1
20:37:21:694609 (+0.0015333 sec) 2
20:37:21:698174 (+0.0035652 sec) 3
20:37:21:699174 (+0.0009993 sec) 4

6.3121  6.3121  6.3121  6.3121
20:38:23:208982 (+0 sec) start
20:38:23:212034 (+0.003052 sec) 1
20:38:23:214051 (+0.0020174 sec) 2
20:38:23:217615 (+0.0035641 sec) 3
20:38:23:219120 (+0.0015047 sec) 4

100000 回の時刻取得して保存するのにだいたい 6ms です
速いですね

要素の足し算部分は

foreach → ForEach → forEach → Sum

の順で速いです

C# でも関数呼び出しになる分 foreach 構文 > ForEach メソッド になるようです

Sum は足し算の部分が組込み関数なので速いかなと期待したのですが 一番ダメでした
返り値を一時保存しないといけないので 毎回変数作ってる分かもしれません

あと LINQ メソッドで拡張メソッドだからというのもあるかもです
ForEach メソッドは LINQ のようで LINQ じゃないです
forEach は速い方の foreach 構文を内部で使っているのに ForEach そこそこ差が出ているので 拡張メソッドが遅いのかもしれません


もうちょい詳しく調べてもいいのですけど だいたいの速度がわかればいいので今回はこの程度にしておきます


さて 速いのはわかりました
ですが JavaScript ってどんなものだっけ?と本来の目的を思い出したので JavaScript でも同じの作ってみます
<!doctype html>
<meta charset="utf-8">
<script>
var arr = []
for(var i=0;i<100000;i++) arr.push(Date.now())
var p = arr[0]
var a = 0

console.time("1")
arr.forEach(e => {
  a += e - p
  p = e
})
console.timeEnd("1")
console.log(a + "ms")
</script>

Chrome はこうなりました
1: 7.000ms
27ms

100000 回時刻を保存するのは 7ms
はやっ!!!

C# と 1ms しかかわりません

でも forEach を使う差分計算は 27ms で C# の 10倍くらいかかってます
for に置き換えれば数十パーセント早くなりますがやはり C# が大きく勝ってます



おまけの IE

IE11
1: 18.445 ミリ秒
134ms


Edge
1: 15.965 ミリ秒
79ms

やっぱり IE はダメですね
Edge は思ったほどじゃないですが IE よりはよくなっています

Chrome (V8) は速度面ではすごいんだなぁと思いますね