Я уже нашел эти узкие места в приложениях, которые мне нужно было оптимизировать, и они являются верным признаком того, что вы врезались в стену и не можете оптимизировать дальше.
Наилучшим вариантом действий будетвыбрать другой алгоритм или макет данных, который соответствует платформе и шаблонам доступа лучше, чем тот, который у вас есть в настоящее время.Это, пожалуй, самая важная вещь, которую вы можете сделать.
Однако из-за крайних сроков или других ограничений, которые иногда невозможны, вам придется проявить изобретательность, а это, вероятно, потребует тестирования.несколько элементов одновременно с использованием операций SIMD (например, используйте встроенную функцию _mm_cmpeq_epi32 для сравнения 4 элементов).Если вы собираетесь выполнить ответвление, вы можете сравнить 16 элементов, поразрядно или по маскам, и выполнить переход по ним (затем выбрать правильные данные внутри ветви).
Это в первую очередь выгодно на платформах, где ветки очень дороги, а на IA-32/64 это не так (например, ветки дешевы).
Также следует помнить, что из-зана платформы Intel Out-of-order Execution (OOE), чтобы затем использовать;вполне может быть так, что используемый вами профилировщик сообщает об остановке в более или менее случайном месте, потому что так получается, что процессору нужно ждать, пока данные будут считаны из кеша или ОЗУ.
Если вы оказались в такой ситуации, убедитесь, что вы оптимизировали свой алгоритм, чтобы сделать его более удобным для кэша (например, выясните, сколько элементов помещается в строку кэша, уменьшите размер структур данных и т. Д.).)