Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Компилировать в Debug. Для Release Error code time будет просто 0, так как компилятор выкинет весь этот код с вызовом функции. Выкинуть код с исключением он не может.
PD>Так что не надо заявлять, что обработка исключений столь уже дешева. Это все же вызов ядра (throw в VC++ вызывает RaiseException)
Давай правильно сравнивать.
Кинуть исключение дороже чем вернуть значение, с этим никто не спорит.
Однако, исключения это исключительная ситуация, а посему это должно быть редким явлением.
А теперь сравним именно такой код:
#include <windows.h>
int ErrorCodeFunction(int count)
{
if (count < -1) return 0;
return count > 100 ? 1 : 2;
}
int ThrowFunction(int count) {
if (count < -1) throw 1;
return count > 100 ? 1 : 2;
}
int _tmain(int argc, _TCHAR* argv[])
{
DWORD dwTimeStart, dwTimeEnd;
int count = 1000000;
dwTimeStart = GetTickCount();
for (int i = 0; i < count; i++)
{
int result = ErrorCodeFunction(count);
}
dwTimeEnd = GetTickCount();
printf("Error code time = %d\n", dwTimeEnd - dwTimeStart);
dwTimeStart = GetTickCount();
for (int i = 0; i < count; i++)
{
try {
int result = ThrowFunction(count);
}
catch (...) {}
}
dwTimeEnd = GetTickCount();
printf("Try catch time = %d\n", dwTimeEnd - dwTimeStart);
return 0;
}
Release:
Error code time = 0
Try catch time = 0
Увеличим количество итераций: int count = 100*1000*1000;
Release:
Error code time = 47
Try catch time = 62
Получаем разницу 15ms/10*1000*1000 = 1.5ns.
Не так много учитывая упрощение кода.