Re[5]: Разработка на чистом C
От: Pavel Dvorkin Россия  
Дата: 31.10.16 14:46
Оценка:
Здравствуйте, _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
With best regards
Pavel Dvorkin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.