Re[4]: Разработка на чистом C
От: _NN_  
Дата: 31.10.16 09:41
Оценка: 20 (2) +1 -2
Здравствуйте, 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.
Не так много учитывая упрощение кода.
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.