コードを想像してください:
public class obj
{
// elided
}
public static Dictionary<string, obj> dict = new Dictionary<string, obj>();
方法1
public static obj FromDict1(string name)
{
if (dict.ContainsKey(name))
{
return dict[name];
}
return null;
}
方法2
public static obj FromDict2(string name)
{
try
{
return dict[name];
}
catch (KeyNotFoundException)
{
return null;
}
}
これらの2つの関数のパフォーマンスに違いがあるかどうか気になったのは、最初の関数は2番目の関数よりも遅い必要があるためです。一度だけですが、WOW、それは実際には反対です:
1 000 000値のループ(100 000が存在し、900 000が存在しない):
最初の関数:306ミリ秒
2番目の関数:20483ミリ秒
何故ですか?
編集:この質問の下のコメントでわかるように、2番目の関数のパフォーマンスは、実際には存在しないキーが0の場合、最初の関数よりもわずかに優れています。ただし、存在しないキーが少なくとも1つ以上存在すると、2番目のキーのパフォーマンスは急速に低下します。
O(1)
は、ディクショナリでの検索よりも多くの命令が含まれます...特に、2つのO(1)
操作を実行することは依然として漸近的であるためO(1)
です。
ContainsKey
が、期待されていO(1)
ます...