Здравствуйте, Pavel Dvorkin, Вы писали:
Ок более приближённый тест функция верхнего уровня не оптимизируется , скажем это функция обратного вызова.
#include <windows.h>
int ErrorCodeFunction(int count)
{
if (count < -1) return 0;
return count > 100 ? 1 : 2;
}
int CallErrorCodeFunction(int count)
{
int r= ErrorCodeFunction(count);
if (r == 0)
{
return 0;
}
else
return r;
}
int ThrowFunction(int count) {
if (count < -1) throw 1;
return count > 100 ? 1 : 2;
}
int CallThrowFunction(int count)
{
return ThrowFunction(count);
}
__declspec(noinline) int TestErrorCode(int result, int count)
{
CallErrorCodeFunction(count);
return result + 1;
}
__declspec(noinline) int TestThrow(int result, int count)
{
try {
ThrowFunction(count);
return result + 1;
}
catch (...) {}
}
int _tmain(int argc, _TCHAR* argv[])
{
DWORD dwTimeStart, dwTimeEnd;
int count = 100 * 1000 * 1000;
int result=100;
dwTimeStart = GetTickCount();
for (int i = 0; i < count; i++)
{
result = TestErrorCode(result, count);
}
dwTimeEnd = GetTickCount();
printf("Error code time = %d\n", dwTimeEnd - dwTimeStart);
dwTimeStart = GetTickCount();
for (int i = 0; i < count; i++)
{
result = TestThrow(result, count);
}
dwTimeEnd = GetTickCount();
printf("Try catch time = %d\n", dwTimeEnd - dwTimeStart);
return 0;
}
Тогда расклад:
Error code time = 125
Try catch time = 141
Debug: для 10*1000*1000
Error code time = 687
Try catch time = 469
VS2015Update3