Представьте себе код:
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;
}
}
Мне было любопытно, если есть разница в производительности этих двух функций, потому что первая ДОЛЖНА быть МЕНЬШЕ, чем вторая - учитывая, что необходимо дважды проверить, содержит ли словарь значение, в то время как второй функции нужен только доступ к словарю один раз но ВАУ, на самом деле все наоборот
Цикл для 1 000 000 значений (с 100 000 существующих и 900 000 несуществующих):
первая функция: 306 миллисекунд
вторая функция: 20483 миллисекунды
Это почему?
РЕДАКТИРОВАТЬ: Как вы можете заметить в комментариях ниже этого вопроса, производительность второй функции на самом деле немного лучше, чем первая в случае, если есть 0 несуществующих клавиш. Но при наличии как минимум 1 или более несуществующих ключей производительность второго быстро снижается.
O(1)в словаре ... Особенно потому, что выполнение двух O(1)операций все еще асимптотически O(1).
ContainsKeyкак ожидаетсяO(1)...