У меня есть некоторый унаследованный внутренний код C ++, который при компиляции с VC ++ в Windows выполняется на порядок быстрее, чем при компиляции с g ++ в Linux (5 минут против 2 часов). Это остается в силе как с «обычными» флагами оптимизации, так и без них, а также с несколькими различными версиями каждого компилятора и соответствующей платформы на сопоставимом оборудовании.
При создании версии отладки / профиля (-g -pg) для Linux с g ++ я вижу, что следующие три области занимают большую часть времени:
% cumulative self self total
time seconds seconds calls Ks/call Ks/call name
31.95 955.93 955.93 3831474321 0.00 0.00 std::_List_const_iterator<xxFile>::operator!=(std::_List_const_iterator<xxFile> const&) const
22.51 1629.64 673.71 3144944335 0.00 0.00 std::_List_const_iterator<xxFile>::operator++()
15.56 2095.29 465.65 686529986 0.00 0.00 std::iterator_traits<std::_List_const_iterator<dtFile> >::difference_type std::__distance<std::_List_const_iterator<xxFile> >(std::_List_const_iterator<xxFile>, std::_List_const_iterator<xxFile>, std::input_iterator_tag)
(класс xxFile состоит из целых чисел, чисел с плавающей запятой, двойных чисел, значений типа bools и строк)
Мои наивные предположения состоят в том, что есть что-то плохо закодированное, что компенсирует VC ++, или что GNU STL может быть не так оптимизирован. В настоящее время я работаю над компиляцией версии g ++ / Linux с помощью библиотеки Boost, начиная с assign / std / list.hpp и пространства имен boost :: assign.
Я не могу поделиться кодом, но разве что-то очевидное (помимо моего ограниченного опыта в C ++) выявляется в качестве причины, исходя из вашего опыта?