LINUX.ORG.RU

C++, обработка исключений


0

0

Есть следующий код (вычисление числа Фибоначчи неэффективным
способом, и с помощью исключений):

#include <iostream>
void fib(int k)
{
    if (k<=1) throw int(k);
    try {
        fib(k-1);
    }
    catch(int a) {
        try {
            fib(k-2);
        }
        catch(int b) {
            throw a+b;
        }
    }
}
int main() {
    try {
        fib(30);
    }
    catch(int x) {
        std::cout<<x<<std::endl;
    }
}

компилируем, выполняем, мерим время работы:
$ g++ -o fib fib.cpp
$ time -p ./fib
832040
real 22.89
user 22.87
sys 0.00

теперь то же проделываем, используя mingw и wine:
$ i586-mingw32msvc-g++ -o fib.exe fib.cpp
$ time -p wine ./fib.exe
832040
real 2.67
user 2.62
sys 0.01

Чем же уважаемые посетители ЛОРа объяснят почти 9-е кратное
преимущество в скорости варианта, скомпиленного под Windows?
★★★★★

Ну посмотри в ассемблерный листинг. Вроде в винде есть SEH, который такие вещи упрощает. А вообще исключения - не средство управления потоком выполнения (в этом качестве они хуже goto), а средство обработки исключительных (которые случаются редко) ситуаций, соответственно скорость работы при обработке исключения не должна сильно волновать.

Legioner ★★★★★
()
Ответ на: комментарий от mv

> У компиляторов ключики по-умолчанию одинаковые ли?

Много ключиков перепробовал, существенно ускорить вариант под Linux не удалось :(

Adjkru ★★★★★
() автор топика
Ответ на: комментарий от Adjkru

А надо ли ускорять? Ведь в любой книжке по C++ можно прочитать, что C++ exceptions адский тормоз и потому не должен использоваться в при нормальном пути исполнения программы.

cobold ★★★★★
()

Дело в том, что пример работает ТАК медленно, потому что exceptions намеренно генерируются при каждом вызове функции. В случае, когда обработка exceptions присутствует в коде, но они не генерируются во время выполнения, разница практически незаметна, тк большинство компиляторов использует shadow stack для exceptions.

Motl
()

может все таки Саттера почитаете вместо того чтобы кидать сюда всякую синтетику и ересь

acefsm
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.