Здравствуйте, _NN_, Вы писали:
PD>>Компилировать в Debug. Для Release Error code time будет просто 0, так как компилятор выкинет весь этот код с вызовом функции. Выкинуть код с исключением он не может.
PD>>Так что не надо заявлять, что обработка исключений столь уже дешева. Это все же вызов ядра (throw в VC++ вызывает RaiseException)
_NN>Давай правильно сравнивать.
_NN>Кинуть исключение дороже чем вернуть значение, с этим никто не спорит.
_NN>Однако, исключения это исключительная ситуация, а посему это должно быть редким явлением.
_NN>А теперь сравним именно такой код:
<skipped>
Ну писал же я чуть выше — компилировать в Debug, потому что Release просто выкинет код. Нет же, не верят. Ладно
Компилируем твой код в Release, ставим брекпойнт и смотрим disassembly
dwTimeStart = GetTickCount();
0038102B mov ebx,dword ptr ds:[382000h]
00381031 mov edi,5F5E100h
00381036 mov dword ptr [count],edi
00381039 call ebx
0038103B mov esi,eax
for (int i = 0; i < count; i++)
{
int result = ErrorCodeFunction(count);
}
dwTimeEnd = GetTickCount();
0038103D call ebx
printf("Error code time = %d\n", dwTimeEnd - dwTimeStart);
0038103F sub eax,esi
00381041 push eax
00381042 push 382118h
00381047 call dword ptr ds:[382098h]
0038104D add esp,8
call ebx — это и есть вызов GetTickCount. А между этими двумя вызовами стоит одна команда mov esi,eax. Вот ее время выполнения ты и замерил
_NN>Release:
_NN>Error code time = 0
_NN>Try catch time = 0
_NN>Увеличим количество итераций: int count = 100*1000*1000;
_NN>Release:
_NN>Error code time = 47
_NN>Try catch time = 62
А вот здесь у меня соответственно 0 и 217. Время выполнения команды команды mov esi,eax не изменилось
_NN>Получаем разницу 15ms/10*1000*1000 = 1.5ns.
Увы, но у меня будет 217/0
VS 2013