| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > C++ vs F90, комплексные числа |
| Автор: kamre 19.10.2007, 23:16 | ||||||||||||||||
| Вообщем, имеется программа на fortran 90, интенсивно использующая вычисления с комплексными числами. Подумываю переписать ее на C++ и развивать дальше. Программа работает долго, поэтому очень важным критерием является скорость получаемого бинарного кода. Решил сравнить скорость работы с комплексными числами на C++ и на Fortran90, чтобы понять, не упадет ли производительность. Вот код на Fortran 90:
А вот эквивалентная программа на C++, использующая тип std::complex<double>, который является аналогом complex(8) из Fortran 90:
Компиляторы используются следующие:
и
Компилирую вот так:
и так:
На моем ноутбуке (Processor (CPU): Intel® Celeron® M CPU 430 @ 1.73GHz) получаются вот такие результаты: для c++:
для fortran:
На рабочем компьютере пока еще не тестировал (хотя там только win2k, msvc-2005 и ifort 9.1), но все равно 4.966/3.742 ~= 1.33, т.е. c++ медленнее на 33%. Не слишком ли это много для такой простой программки? Программа на фортране сейчас считает по несколько часов, так что не хотелось бы ухудшить производительность на треть при переходе на c++. |
| Автор: Daevaorn 19.10.2007, 23:25 |
| А компилятором С++ от Intel почему не протестировали? А то получаютсяне не очень равные условия. Хотя то что фортран быстрее вполне ожидаемо. |
| Автор: kamre 20.10.2007, 00:16 | ||||||||
А почему ожидаемо? Потому что в fortran тип комплексных чисел на уровне компилятора, а в c++ на уровне библиотеки stl? На самом деле потестировал. Но результаты совсем плохие получились.
Комипилировал так:
Вот такие результаты:
Честно говоря, никогда не разбирался с компилятором для c++ от Intel. Возможно не правильно компилирую...Глянул man, там куча опций для различных оптимизаций... А с ним должны свои реализации stl идти или нет? |
| Автор: Ln78 20.10.2007, 07:14 |
| Когда-то я тоже такое сравнение проводил, только использовал для фортрана транслятор то ли от MS (вроде именно его), то ли Compaq. Для С++ использовал VS7.0 и C++Builder6.0, сравнивал как стандартный класс complex, так и свой собственный, ещё давно написанный (я, вообще, "изобретатель велосипедов"). Борландовский оказался хуже всех. Для VS обнаружил какую-то непонятную особенность: операция деления комплексных чисел выполнялась на порядок медленнее, например, умножения. Собственная реализация оказалась неуступающей фортрановской, её и оставил для дальнейшего использования, цель сравнения была как раз выяснить, не пора ли её выбросить. Но это было лет 5 назад, сейчас этими задачами не занимаюсь, так что, возможно, сведения устарели. |
| Автор: Daevaorn 20.10.2007, 08:35 |
а фортрановый вариант сколько? сранивать надо, один результат С++ ничего не говорит. |
| Автор: kamre 20.10.2007, 09:00 | ||
В смысле сколько? В первом же посте есть время для Intel Fortran. А это я просто ту самую c++ программку скомпилировал компилятором Intel c++. |
| Автор: nickless 20.10.2007, 15:39 |
| kamre, может стоит поискать специализированную либу для математических вычислений, а не переписывать кучу кода на С++? Библиотеки скорее всего неплохо оптомизированы, может ассемблером или тем же фортраном Я правда такими либами ни разу не пользовался, могу только предложить соответствующий http://www.gentoo-portage.com/sci-libs портажей Gentoo, в Suse все эти либы скорее всего тоже есть. |
| Автор: kamre 20.10.2007, 18:27 | ||
nickless, пока "куча кода" на фортране не такая уж и большая, и вполне обозримая. В ней не используются никакие сторонние библиотеки. Просто если развивать этот код дальше, то мне кажется, что переход на c++ может дать некоторые преимущества. Но если при таком переходе сильно просядет производительность откомпилированной программы (раза в 1.5 и более), то это не очень оправданный переход. Подскажите, какие-нибудь интересные сравнения в интернете на тему производительности кода на Fortran 90 и на С++. Пока у меня в гугле что-то старенькое все находится и не очень по теме. |
| Автор: kamre 22.10.2007, 14:14 | ||||||
| Сравнил на работе. Процессор: Intel® Pentium® 4 CPU 3.00GHz. Вот такие результаты вышли:
|
| Автор: SergeCpp 22.10.2007, 15:58 | ||
| http://www.research.att.com/~bs/performanceTR.pdf (Note this document from Bjarne Stroustrup's Home Page) PDF, 189 pages, 1.2 megs The aim of this report is: • to give the reader a model of time and space overheads implied by use of various C++ language and library features, • to debunk widespread myths about performance problems, • to present techniques for use of C++ in applications where performance matters, and • to present techniques for implementing C++ Standard language and library facilities to yield efficient code. As far as run-time and space performance is concerned, if you can afford to use C for an application, you can afford to use C++ in a style that uses C++’s facilities appropriately for that application. This report first discusses areas where performance issues matter, such as various forms of embedded systems programming and high-performance numerical computation. After that, the main body of the report considers the basic cost of using language and library facilities, techniques for writing efficient code, and the special needs of embedded systems programming. http://www.ddj.com/cpp/184401628
http://www.ddj.com/web-development/184401491 |
| Автор: SergeCpp 22.10.2007, 16:15 | ||
| http://en.wikipedia.org/wiki/Template_metaprogramming http://www.oonumerics.org/blitz/
http://www.oonumerics.org/blitz/examples/, also look at http://www.oonumerics.org/blitz/examples/fft.html |