Информация об изменениях

Сообщение Re[3]: Разработка на чистом C от 31.10.2016 6:46

Изменено 31.10.2016 6:51 Pavel Dvorkin

Здравствуйте, push, Вы писали:

P>Здравствуйте, smeeld, Вы писали:


S>>Обработка исключений в С++ слишком дорогая операция,

P>По сравнению с чем? По сравнению с полным отказом от обработки ошибок — то да, дорогая. А если сравнивать с ручной обработкой ошибок — так можно сказать ничего не стоит.

int ErrorCodeFunction()
{
    return 1;
}

void ThrowFunction() {
    throw 1;
}

int _tmain(int argc, _TCHAR* argv[])
{
    DWORD dwTimeStart, dwTimeEnd;

    int count = 1000000;

    dwTimeStart = GetTickCount();
    for (int i = 0; i < count; i++)
    {
        int result = ErrorCodeFunction();
    }
    dwTimeEnd = GetTickCount();

    printf("Error code time = %d\n", dwTimeEnd - dwTimeStart);

    dwTimeStart = GetTickCount();
    for (int i = 0; i < count; i++)
    {
        try {
            ThrowFunction();
        }
        catch(...) {}
    }
    dwTimeEnd = GetTickCount();

    printf("Try catch time = %d\n", dwTimeEnd - dwTimeStart);

    return 0;
}



Error code time = 15
Try catch time = 9000

Компилировать в Debug. Для Release Error code time будет просто 0, так как компилятор выкинет весь этот код с вызовом функции. Выкинуть код с исключением он не может.

Так что не надо заявлять, что обработкак исключений столь уже дешева. Это все же вызов ядра (throw в VC++ вызывает RaiseException)
Re[3]: Разработка на чистом C
Здравствуйте, push, Вы писали:

P>Здравствуйте, smeeld, Вы писали:


S>>Обработка исключений в С++ слишком дорогая операция,

P>По сравнению с чем? По сравнению с полным отказом от обработки ошибок — то да, дорогая. А если сравнивать с ручной обработкой ошибок — так можно сказать ничего не стоит.

int ErrorCodeFunction()
{
    return 1;
}

void ThrowFunction() {
    throw 1;
}

int _tmain(int argc, _TCHAR* argv[])
{
    DWORD dwTimeStart, dwTimeEnd;

    int count = 1000000;

    dwTimeStart = GetTickCount();
    for (int i = 0; i < count; i++)
    {
        int result = ErrorCodeFunction();
    }
    dwTimeEnd = GetTickCount();

    printf("Error code time = %d\n", dwTimeEnd - dwTimeStart);

    dwTimeStart = GetTickCount();
    for (int i = 0; i < count; i++)
    {
        try {
            ThrowFunction();
        }
        catch(...) {}
    }
    dwTimeEnd = GetTickCount();

    printf("Try catch time = %d\n", dwTimeEnd - dwTimeStart);

    return 0;
}



Error code time = 15
Try catch time = 9000

Компилировать в Debug. Для Release Error code time будет просто 0, так как компилятор выкинет весь этот код с вызовом функции. Выкинуть код с исключением он не может.

Так что не надо заявлять, что обработка исключений столь уже дешева. Это все же вызов ядра (throw в VC++ вызывает RaiseException)