Есть ли польза от замены STL
контейнеры / алгоритмы с ручным прокатом
из них? В частности, моя программа
включает в себя очень большую очередь приоритетов
(в настоящее время std :: priority_queue)
чья манипуляция занимает много
общее время. Это что-то стоит
изучая или это STL
реализация уже скорее всего
максимально быстро?
STL, как правило, самый быстрый, общий случай. Если у вас есть очень конкретный случай, вы можете увидеть ускорение с прокрученным вручную. Например, std :: sort (обычно быстрая сортировка) - это самая быстрая общая сортировка, но если вы заранее знаете, что ваши элементы практически уже упорядочены, то сортировка вставкой может быть лучшим выбором.
Аналогично, для std :: vectors
чьи необходимые размеры неизвестны, но
иметь достаточно маленькую верхнюю границу,
выгодно ли заменить их
статически распределенные массивы?
Это зависит от того, где вы собираетесь делать статическое распределение. В этой связи я попытался статически выделить большой объем памяти в стеке, а затем повторно использовать его. Результаты? Куча памяти была существенно быстрее. Тот факт, что элемент находится в стеке, не делает его более быстрым для доступа - скорость стековой памяти также зависит от таких вещей, как кэш. Статически размещенный глобальный массив не может быть быстрее кучи. Я предполагаю, что вы уже пробовали такие техники, как просто резервирование верхней границы. Если у вас много векторов с одной и той же верхней границей, рассмотрите возможность улучшения кэша с помощью вектора структур, которые содержат элементы данных.
Я нашел эту динамическую память
распределение часто является серьезным
узкое место, и это устранение
может привести к значительному ускорению. Как
Следствие я интересен в
компромиссы производительности возвращения
большие временные структуры данных
значение против возврата по указателю против
передавая результат по ссылке. Является
есть способ достоверно определить
будет ли компилятор использовать
RVO для данного метода (при условии
вызывающему не нужно изменять
результат, конечно)?
Лично я обычно передаю результат по ссылке в этом сценарии. Это позволяет гораздо больше повторного использования. Передавать большие структуры данных по значению и надеяться, что компилятор использует RVO, не очень хорошая идея, когда вы можете просто вручную использовать RVO.
Как кеш-ориентированные компиляторы склонны
быть? Например, стоит ли искать
в переупорядочение вложенных циклов?
Я обнаружил, что они не были особенно осведомлены о кеше. Проблема в том, что компилятор не понимает вашу программу и не может предсказать подавляющее большинство ее состояний, особенно если вы сильно зависите от кучи. Если у вас есть профилировщик, который поставляется вместе с вашим компилятором, например Visual Guided Optimization, то это может привести к отличным ускорениям.
Учитывая научную природу
программа, числа с плавающей точкой
используется везде. Значительный
узкое место в моем коде раньше
преобразования из плавающей запятой в
целые числа: компилятор будет выдавать код
сохранить текущий режим округления,
изменить его, выполнить преобразование,
затем восстановите старый режим округления ---
хотя в программе ничего нет
когда-либо менял режим округления!
Отключение этого поведения значительно
ускорил мой код. Есть ли подобное
связанные с плавающей точкой Гочас I
должны знать?
Существуют разные модели с плавающей точкой - Visual Studio предоставляет настройку компилятора fp: fast. Что касается точных результатов такого, я не могу быть уверен. Однако вы можете попробовать изменить точность с плавающей точкой или другие параметры в вашем компиляторе и проверить результат.
Одно следствие компиляции C ++
и связано отдельно, что
Компилятор не может сделать то, что
кажется, очень простые оптимизации,
такие как вызовы методов перемещения, такие какstrlen () из завершения
условия петли. Есть ли
оптимизация, как этот, который я
следует высматривать, потому что они не могут
должно быть сделано компилятором и должно быть
сделано вручную?
Я никогда не сталкивался с таким сценарием. Однако, если вы действительно обеспокоены таким, то остается сделать это вручную. Одна из вещей, которую вы могли бы попробовать, это вызвать функцию по константной ссылке, предлагая компилятору, что значение не изменится.
Еще одна вещь, на которую я хочу обратить внимание, - это использование нестандартных расширений для компилятора, например, предоставляемых Visual Studio - __assume. http://msdn.microsoft.com/en-us/library/1b3fsfxw(VS.80).aspx
Есть также многопоточность, которая, я ожидаю, вы пошли по этому пути. Вы можете попробовать некоторые конкретные опции, например, другой ответ, предложенный SSE.
Редактировать: я понял, что многие предложения, которые я разместил, ссылались непосредственно на Visual Studio. Это правда, но GCC почти наверняка предоставляет альтернативы большинству из них. У меня просто личный опыт общения с VS больше всего.