C# ArrayとDictionaryの速度比較
いくつかの数値に対して何かをカウントしていくような形式の時には手癖でDictionaryを使っていたのですが、それで痛い目に遭ったので反省としてかかる時間を調査。
AtCoderの問題が調査のきっかけです。問題はこちら。解法そのままなので気になる方は解いてからどうぞ。
・やること
107までのArray/Dictionaryを作り、1から107までそれぞれについてその数の107までの倍数のカウントを1増やしていく
具体的には以下の通り。
・Array
//①Arrayの作成 sw.Start(); var array = new int[N + 1]; sw.Stop(); Console.WriteLine(sw.Elapsed); //②カウントの加算 sw.Start(); for (var i = 1; i <= N; i++) { for (var j = i; j <= N; j += i) { array[j] += 1; } } sw.Stop(); Console.WriteLine(sw.Elapsed);
・Dictionary
//①Dictionaryの作成 sw.Start(); var dict = new Dictionary<int, int>(); for (var i = 1; i <= N; i++) { dict.Add(i, 0); } sw.Stop(); Console.WriteLine(sw.Elapsed); //②カウントの加算 sw.Restart(); for (var i = 1; i <= N; i++) { for (var j = i; j <= N; j += i) { dict[j] += 1; } } sw.Stop(); Console.WriteLine(sw.Elapsed);
結果は以下。単位は秒です。
Array | ①作成 | ②加算 |
---|---|---|
1回目 | 00.0003549 | 01.6939147 |
2回目 | 00.0003953 | 01.7070274 |
Dictionary | ①作成 | ②加算 |
---|---|---|
1回目 | 00.3353714 | 17.2990964 |
2回目 | 00.3310036 | 17.2898917 |
DictionaryはArrayの約10倍かかるんですね。106までなら実用的な時間(2ms)内に終わるんですが、107になると厳しいと。 1~Nまで網羅的に使うことがわかっている場合は極力Arrayを使うよう気を付けます。