Уявіть код:
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;
}
}
Мені було цікаво, чи є різниця у виконанні цих двох функцій, оскільки перша БУДЬ БУДІТЬ меншою, ніж друга - враховуючи, що їй потрібно двічі перевірити, чи словник містить значення, а другій функції потрібно мати доступ лише до словника колись, але WOW, це насправді навпаки:
Цикл на 1 000 000 значень (зі 100 000 існуючих та 900 000 не існує):
перша функція: 306 мілісекунд
друга функція: 20483 мілісекунди
Чому так?
EDIT: Як ви можете помітити в коментарях під цим питанням, виконання другої функції насправді трохи краще, ніж першої, якщо є 0 неіснуючих клавіш. Але як тільки є щонайменше 1 чи більше неіснуючих клавіш, продуктивність другого швидко знижується.
O(1)
пошуку у словнику ... Тим більше, що виконання двох O(1)
операцій все ще асимптотично O(1)
.
ContainsKey
очікуєтьсяO(1)
...