normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

Dictionary#TryGetValueメソッドはそんなに早いのか?

.NET Framework 2.0から追加されたという噂のメソッドTryGetValueがどれだけ速いのかを試してみたテスト。正直.NET Framework 2.0で追加されたメソッドなんて使い古されてる感が有りますが、ちょっと試してみたくなったのでつい。
比較対象は以下。

  • Dictionary#TryGetValueで値を取得
  • Dictionaryインデクサで値を取得

実際に以下のコードで速度を測ってみました。

public class MainClass
{
    public static void Main(string[] args)
    {
        var openWith2 = new Dictionary<string, string>(){
            {"txt", "notepad.exe"},
            {"bmp", "paint.exe"},
            {"dib", "paint.exe"},
            {"rtf", "wordpad.exe"}
        };

        string val = string.Empty;

        DateTime start = DateTime.Now;
        for (int i = 0; i < 5000; i++)
        {
            openWith2.TryGetValue("aaa", out val);
        }

        DateTime middle = DateTime.Now;
        for (int i = 0; i < 5000; i++)
        {
            try
            {
                val = openWith2["aaa"];
            }
            catch { }
        }
        DateTime end = DateTime.Now;

        Console.WriteLine("TryGetValueでの取得時間 = {0}ms", (middle - start).TotalMilliseconds );
        Console.WriteLine("インデックスでの取得時間 = {0}ms", (end - middle).TotalMilliseconds);
        Console.Read();
    }
}
//TryGetValueでの取得時間 = 2ms
//インデックスでの取得時間 = 15420ms

試しに測ってみたけど物凄い差・・・。やはり例外処理が重いというのは間違いないようで・・・。