Я сделал несколько сравнительных тестов по этому поводу. Но я должен повторить точку зрения Келси:
исключения должны быть сохранены для тех вещей, которые просто не должны
бывает. Если они это сделают, то следует позвонить в колокола тревоги и принести на Голгофу
в. Мне кажется странным использовать исключения для известного случая проблемы
особенно когда вы можете проверить это.
Это имеет смысл, потому что выигрыш в производительности, полученный за try-catch
(если он вообще есть), тривиален, но «улов» может быть более наказывающим. Вот тест:
public static void Benchmark(Action method, int iterations = 10000)
{
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < iterations; i++)
method();
sw.Stop();
MessageBox.Show(sw.Elapsed.TotalMilliseconds.ToString());
}
public static string GetRandomAlphaNumeric()
{
return Path.GetRandomFileName().Replace(".", "").Substring(0, 8);
}
var dict = new Dictionary<string, int>();
Нет дубликатов:
Benchmark(() =>
{
// approach 1
var key = GetRandomAlphaNumeric();
if (!dict.ContainsKey(key))
dict.Add(item, 0);
// approach 2
try
{
dict.Add(GetRandomAlphaNumeric(), 0);
}
catch (ArgumentException)
{
}
}, 100000);
50% дубликатов:
for (int i = 0; i < 50000; i++)
{
dict.Add(GetRandomAlphaNumeric(), 0);
}
var lst = new List<string>();
for (int i = 0; i < 50000; i++)
{
lst.Add(GetRandomAlphaNumeric());
}
lst.AddRange(dict.Keys);
Benchmark(() =>
{
foreach (var key in lst)
{
// approach 1
if (!dict.ContainsKey(key))
dict.Add(key, 0);
// approach 2
try
{
dict.Add(key, 0);
}
catch (ArgumentException)
{
}
}
}, 1);
100% дубликатов
var key = GetRandomAlphaNumeric();
dict.Add(key, 0);
Benchmark(() =>
{
// approach 1
if (!dict.ContainsKey(key))
dict.Add(item, 0);
// approach 2
try
{
dict.Add(key, 0);
}
catch (ArgumentException)
{
}
}, 100000);
Результаты
Нет дубликатов
подход 1: отладка -> 630 мс - 680 мс; расцепление -> 620 мс - 640 мс
подход 2: отладка -> 640 мс - 690 мс; расцепление -> 640 мс - 670 мс
50% дубликатов
подход 1: отладка -> 26 мс - 39 мс; расцепление -> 25 мс - 33 мс
подход 2: отладка -> 1340 мс; выпуск -> 1260 мс
100% дубликатов
подход 1: отладка -> 7 мс; выпуск -> 7 мс
подход 2: отладка -> 2600 мс; расцепление -> 2400 мс
Вы можете видеть, что при увеличении дубликатов try-catch
работает плохо. Даже в худшем случае, когда у вас вообще нет дубликатов, прирост производительности try-catch
не является чем-то существенным.