Обработка исключений удобна, она обеспечивает тонкий синтаксис и облегчает проверку каждой допустимости.
Я решил проверить, эффективна ли обработка исключений (в точке net), потому что она генерирует стек вызовов и связанная с этим информация.
Итак, я написал следующий тест:
using System;
using System.Diagnostics;
namespace ExceptionTest
{
class Program
{
static void Main(string[] args)
{
int nTests = 50;
int[] io = new int[12];
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < nTests; i++)
{
try
{
io[13] = 3;
}
catch
{
}
}
sw.Stop();
var t1 = sw.ElapsedMilliseconds;
sw.Restart();
//I had to do more tests so to have a significant time precision
double nMult = 10000000;
for (int i = 0; i < nMult * nTests; i++)
{
if (io.Length > 13)
{
io[13] = 3;
}
}
sw.Stop();
var t2 = sw.ElapsedMilliseconds;
Console.Write("Handling exceptions (t1): " + t1.ToString() + "\r\n\r\nTesting before call (t2): " + (t2 / nMult).ToString());
Console.Write("\r\n\r\nTime ratio (t1/t2): " + (t1 / (t2/nMult)).ToString());
Console.Read();
}
}
}
И результаты:
Обработка исключений (t1): 434 мс
Тестирование перед вызовом (t2): 0,0001407 мс
Соотношение времени (t1 / t2): 3084577,11442786
Я был удивлен! На создание исключения уходит еще 3 миллиона раз!
Мои вопросы:
Почему это занимает столько времени?
Есть ли способ его улучшить? (Вроде как флаг времени выполнения, чтобы не генерировать трассировки и просто go вернуться к улову)
Я знаю, что исключения являются исключениями, и их следует избегать, но эти результаты далеки от ожидаемых!
Редактировать:
В первом тесте я запустил конфигурацию отладки.
Новые результаты с использованием конфигурации выпуска:
Обработка исключений (t1): 9
Тестирование перед вызовом (t2): 7,13E-05
Соотношение времени (t1 / t2): 126227,208976157
Немного лучше, но все еще далеко много времени.
По данным Microsoft site :
Используйте обработку исключений, если событие происходит не очень часто, то есть если Событие действительно исключительное и указывает на ошибку (например, неожиданный конец файла). Когда вы используете обработку исключений, в нормальных условиях выполняется меньше кода.
Проверьте наличие ошибок в коде, если событие происходит регулярно и может рассматриваться как часть нормального выполнения. При проверке распространенных состояний ошибок выполняется меньше кода, поскольку вы избегаете исключений.