Прочитав, что исключения являются дорогостоящими с точки зрения производительности, я составил простую программу измерений, очень похожую на ту, которую Джон Скит опубликовал несколько лет назад . Я упоминаю это здесь в основном, чтобы предоставить обновленные номера.
Программа обработала менее 29914 миллисекунд, чтобы обработать миллион исключений, что составляет 33 исключений в миллисекунду . Это достаточно быстро, чтобы сделать исключения жизнеспособной альтернативой кодам возврата для большинства ситуаций.
Обратите внимание, однако, что с кодами возврата вместо исключений одна и та же программа выполняется менее одной миллисекунды, что означает, что исключения как минимум в 30000 раз медленнее, чем коды возврата . Как подчеркнул Рико Мариани , эти числа также являются минимальными числами. На практике создание и отлов исключений займет больше времени.
Измерено на ноутбуке с Intel Core2 Duo T8100 @ 2,1 ГГц с версией .NET 4.0 в сборке выпуска не работает под отладчиком (что может замедлить работу).
Это мой тестовый код:
static void Main(string[] args)
{
int iterations = 1000000;
Console.WriteLine("Starting " + iterations.ToString() + " iterations...\n");
var stopwatch = new Stopwatch();
// Test exceptions
stopwatch.Reset();
stopwatch.Start();
for (int i = 1; i <= iterations; i++)
{
try
{
TestExceptions();
}
catch (Exception)
{
// Do nothing
}
}
stopwatch.Stop();
Console.WriteLine("Exceptions: " + stopwatch.ElapsedMilliseconds.ToString() + " ms");
// Test return codes
stopwatch.Reset();
stopwatch.Start();
int retcode;
for (int i = 1; i <= iterations; i++)
{
retcode = TestReturnCodes();
if (retcode == 1)
{
// Do nothing
}
}
stopwatch.Stop();
Console.WriteLine("Return codes: " + stopwatch.ElapsedMilliseconds.ToString() + " ms");
Console.WriteLine("\nFinished.");
Console.ReadKey();
}
static void TestExceptions()
{
throw new Exception("Failed");
}
static int TestReturnCodes()
{
return 1;
}