tag:blogger.com,1999:blog-3940972473404160061.post2305279365393735348..comments2023-02-12T04:29:48.804-08:00Comments on Programming DIY / Программирование — это просто!: Кто быстрее: функтор или указатель на функциюАлександрhttp://www.blogger.com/profile/03980297457924475954noreply@blogger.comBlogger11125tag:blogger.com,1999:blog-3940972473404160061.post-91261531198176502992010-05-13T02:37:16.317-07:002010-05-13T02:37:16.317-07:00Некоторые вещи, связанные с тестированием эффектив...Некоторые вещи, связанные с тестированием эффективности в C++<br /><br /> http://groups.google.co.il/group/perfo<br /> http://groups.google.co.il/group/sources<br /> http://groups.google.co.il/group/log-filesAnonymoushttps://www.blogger.com/profile/09832654693565448499noreply@blogger.comtag:blogger.com,1999:blog-3940972473404160061.post-51570605391944885342009-08-13T03:21:30.366-07:002009-08-13T03:21:30.366-07:00Идиотские эксперименты.. вообще на ассемблере пиши...Идиотские эксперименты.. вообще на ассемблере пишите и будет вам скорость...Livithanhttps://www.blogger.com/profile/08480181693612539996noreply@blogger.comtag:blogger.com,1999:blog-3940972473404160061.post-42737076679723500022009-07-27T04:22:42.191-07:002009-07-27T04:22:42.191-07:00Да, про -fdump-tree-optimize я уж понял, обнаружив...Да, про -fdump-tree-optimize я уж понял, обнаружив интересный файл объяснениями что куда соптимизировалось ;-).<br /><br />А быстро, потому, что я уменьшил N на один нолик ;-). На которых моих машинах я ограничен в плане ресурсов, и программа падала с std::bad_alloc из-за нехватки памяти. Пришлось уменьшить размерность. Но в целом, показательность осталась.Александрhttps://www.blogger.com/profile/03980297457924475954noreply@blogger.comtag:blogger.com,1999:blog-3940972473404160061.post-54313029460086493922009-07-27T04:11:52.384-07:002009-07-27T04:11:52.384-07:00Я не понятно объяснил =)
-fdump-tree-optimized не ...Я не понятно объяснил =)<br />-fdump-tree-optimized не влияет на компиляцию, а только генерирует промежуточный си-подобный листинг в файле с расширением optimized. Там и можно посмотреть, что подставилось, а что нет.<br /><br />Кстати, почему у вас так быстро отрабатывает? У меня после вызова srand в среднем по 5-7 секунд отрабатывает. Без srand что -O3, что -O2 отрабатывают за абсолютно одинаковое время.Lockalhttps://www.blogger.com/profile/04536631902302476376noreply@blogger.comtag:blogger.com,1999:blog-3940972473404160061.post-89358415820654705382009-07-27T02:49:49.270-07:002009-07-27T02:49:49.270-07:00Lockal: Я тут разыскал GCC 4.4.0 и вот что вышло с...<b>Lockal</b>: Я тут разыскал GCC 4.4.0 и вот что вышло с вашим примером:<br /><br />g++ -o func -O3 func.cpp<br /><br />Standart: 0.45<br />Function: 0.38<br />Functor: 0.41<br /><br />g++ -o func -O2 func.cpp<br /><br />Standart: 0.39<br />Function: 0.38<br />Functor: 0.38<br /><br />Получается, что -O2 в данном случае лучше чем -O3 (повторял много раз, тенденция одна и та же), а опция -fdump-tree-optimized роли не играет.Александрhttps://www.blogger.com/profile/03980297457924475954noreply@blogger.comtag:blogger.com,1999:blog-3940972473404160061.post-58934278911411742552009-07-26T04:40:42.124-07:002009-07-26T04:40:42.124-07:00x86, Intel E8500.
Прогнал ещё раз 10, различия то...x86, Intel E8500.<br /><br />Прогнал ещё раз 10, различия только в случайных погрешностях.<br /><br />Попробуйте http://www.mediafire.com/download.php?1jtjnzwwihm , может правда пора обновляться.Lockalhttps://www.blogger.com/profile/04536631902302476376noreply@blogger.comtag:blogger.com,1999:blog-3940972473404160061.post-10571371656330495842009-07-26T04:15:37.743-07:002009-07-26T04:15:37.743-07:00А вот прогон вашего примера через cl, правда на др...А вот прогон вашего примера через cl, правда на другой машине.<br /><br />cl /O2 functor.cpp<br /><br />functor.exe<br /><br />Standart: 0.047<br />Function: 0.157<br />Functor: 0.078<br /><br />Тенденция та же.Александрhttps://www.blogger.com/profile/03980297457924475954noreply@blogger.comtag:blogger.com,1999:blog-3940972473404160061.post-12914243506079446492009-07-26T04:12:58.789-07:002009-07-26T04:12:58.789-07:00Хм, скомпилил ваш пример на GCC 4.3.2.
g++ -O3 -f...Хм, скомпилил ваш пример на GCC 4.3.2.<br /><br />g++ -O3 -fdump-tree-optimized functor.cpp<br /><br />./functor<br /><br />Standart: 0.562<br />Function: 0.969<br />Functor: 0.563<br /><br />Странно. Опять функтор быстрее.<br /><br />Может в платформе дело? Я компилю все на x86, а вы на какой?Александрhttps://www.blogger.com/profile/03980297457924475954noreply@blogger.comtag:blogger.com,1999:blog-3940972473404160061.post-88665280594144540102009-07-26T03:31:26.468-07:002009-07-26T03:31:26.468-07:00http://pastebin.com/f51bd326f
Если скомпилируете ...http://pastebin.com/f51bd326f<br /><br />Если скомпилируете в g++ с флагами -O3 -fdump-tree-optimized, то будет видно различие (точнее почти отсутствие различий) в генерируемых оптимизированных алгоритмах.<br /><br />В первом примере генерируется вызов подставленной __introsort_loop без компаратора.<br /><br />Во втором примере вызов генерированной функции, аналогичной __introsort_loop без компаратора. Функция по указателю снова инлайнится.<br /><br />В третьем примере идёт вызов __introsort_loop с компаратором, при этом компаратор также подставляется в генерируемую функцию.Lockalhttps://www.blogger.com/profile/04536631902302476376noreply@blogger.comtag:blogger.com,1999:blog-3940972473404160061.post-42900035582671251312009-07-25T14:47:28.231-07:002009-07-25T14:47:28.231-07:00Собрал конкретно этот пример в GCC 4.3.2 20080827 ...Собрал конкретно этот пример в GCC 4.3.2 20080827 (beta) 2 на чуть более быстрой машине.<br /><br />g++ -O3 -o functor -I. functor.cpp gtest-all.cc<br /><br />./functor<br /><br />[==========] Running 3 tests from 1 test case.<br />[----------] Global test environment set-up.<br />[----------] 3 tests from Callback<br />[ RUN ] Callback.BuiltIn<br />[ OK ] Callback.BuiltIn (4392 ms)<br />[ RUN ] Callback.Function<br />[ OK ] Callback.Function (9719 ms)<br />[ RUN ] Callback.Functor<br />[ OK ] Callback.Functor (4391 ms)<br />[----------] 3 tests from Callback (18542 ms total)<br /><br />[----------] Global test environment tear-down<br />[==========] 3 tests from 1 test case ran. (18545 ms total)<br />[ PASSED ] 3 tests.<br /><br />Опять указатель на функцию проигрывает.<br /><br />К сожалению на GCC 4.4.1 проверить не могу, но если оптимизатор в 4.4.1 так радикально шагнул вперед по сравнению с 4.3.2, то надо срочно обновляться. Хотя, как-то сомнительно.<br /><br />Кстати, компилятор cl из Visual Studio 2008, версия 15.00.21022.08 for 80x86.<br /><br />Просто интересно, как можно оптимизировать в inline вызов по указателю, если в runtime указатель может быть другой.<br /><br />Может мы компилируем разные примеры? Можете привести ваш тест?Александрhttps://www.blogger.com/profile/03980297457924475954noreply@blogger.comtag:blogger.com,1999:blog-3940972473404160061.post-30108655752169528232009-07-25T11:39:15.246-07:002009-07-25T11:39:15.246-07:00Для интереса скомпилировал похожий бенчмарк в g++ ...Для интереса скомпилировал похожий бенчмарк в g++ 4.4.1 и icc 11.1:<br />g++ functor.cc -O3<br />> Standart: 6.29<br />> Function: 6.26<br />> Functor: 6.32<br /><br />icc functor.cc -fast<br />> Standart: 5.19<br />> Function: 5.23<br />> Functor: 5.23<br /><br />Я к тому, что из подобных сравнений не стоит делать такие громкие выводы. Единственный вывод, который можно сделать, что, вероятно, cl (какой версии?) не умеет делать инлайнинг функций, переданных как указателей в std::sort.Lockalhttps://www.blogger.com/profile/04536631902302476376noreply@blogger.com