это продолжение существующего потока (http://stackoverflow.com/questions/12724887/caching-in-a-high-performance-financial-application) - я обнаружил, что это не кеш, который мешает моему приложению. Короче говоря, у меня есть приложение, которое тратит 70 процентов времени выполнения на одну функцию (15 секунд из 22). Следовательно, я хотел бы максимально сократить время выполнения этой функции, поскольку предполагаемое использование функции предназначено для НАМНОГО больших данных (т.е. 22 секунды не являются запланированным временем выполнения :)
Проблема в том, что вывод VTune меня озадачивает, код тратит огромное количество времени в совершенно неожиданных местах. У меня закончились идеи, поэтому я публикую свой проект вместе с результатами профайлера здесь.
Взглянув на инкриминированную функцию AssessmentExits(), я озадачен следующими вещами:
1/ функция тратит 2,2 с на вызов встроенной функции, которая возвращает 1 независимо от параметров (строка 425, this->contractManager->contractCount()). Примечание: версия, в которой функция возвращает 1 независимо от параметров, является одним из возможных случаев, поэтому я не могу поставить "contractCount=1" и оставить так. Может ли перенаправление с указателя виртуальной таблицы съесть эти 2,2 секунды (contractCount() — виртуальный метод)?
2/ функция тратит 3,3 с на min(uint1, uint2) (строка 432), несмотря на то, что я использую версию wmin, которая должна быть максимально дружественной к процессору.
3/ функция тратит 1,6 с на строку 512, что является очень тривиальной операцией, а вызываемая функция не является виртуальной.
Итак, вопросы: почему эти три строчки кода занимают так много времени? Что я упускаю из виду? И как я могу оптимизировать свой код, чтобы он работал быстрее? Должен ли я заменить wmin() версией min SSE, применяемой ко всем массивам?
Любой вклад очень ценится. Даниэль
EDIT: Взглянув на сборку, я обнаружил, что в случае 1/ действительно именно vfptr делает код "медленным". Я заменил вызов виртуальной функции на fastdelegate Дона Клагстона, но никаких изменений в производительности не произошло (я понятия не имею, почему). Благодаря комментарию Найтингейла вложения теперь должны содержать все необходимые файлы. Однако двоичный файл не может быть успешно запущен, так как он подключается к общей памяти, где находятся сотни МБ данных.
Итак, я прикрепляю весь проект вместе с результатами VTune здесь и здесь