Есть следующий код (вычисление числа Фибоначчи неэффективным
способом, и с помощью исключений):
#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), а средство обработки исключительных (которые случаются редко) ситуаций, соответственно скорость работы при обработке исключения не должна сильно волновать.
А надо ли ускорять? Ведь в любой книжке по C++ можно прочитать, что C++ exceptions адский тормоз и потому не должен использоваться в при нормальном пути исполнения программы.
Дело в том, что пример работает ТАК медленно, потому что exceptions намеренно генерируются при каждом вызове функции. В случае, когда обработка exceptions присутствует в коде, но они не генерируются во время выполнения, разница практически незаметна, тк большинство компиляторов использует shadow stack для exceptions.