Локальность кэша и вызовы функций - PullRequest
0 голосов
/ 20 января 2020

У меня есть функция, которая выполняет задачу, давайте вызовем эту функцию F(). Теперь мне нужно выполнить эту задачу n раза, где достаточно мало. Я могу думать о двух вещах:

  1. //Code Here... Code-for-function-F() Code-for-function-F() . . . Code-for-function-F() //following code

  2. //Code Here for(int i=0; i<n; ++i) F() //Following code

В первом случае я избегаю накладных расходов на вызовы функций. Но поскольку код повторяется n раз, код может быть довольно большим и привести к ухудшению локальности / производительности кэша. Во втором случае лучше использовать кэш, но это приводит к накладным расходам из-за вызовов функций. Мне было интересно, если кто-то сделал анализ, какой из двух является лучшим подходом.

PS: Я понимаю, что фактический ответ может зависеть от того, что говорит мне профилирование кода, существует ли теоретически лучший подход между ними? Я использую C ++ на Linux.

1 Ответ

2 голосов
/ 20 января 2020

Нет единого ответа, когда вопрос в том, какой код быстрее. Вы должны измерить его.

Однако оптимизация, которую вы имеете в виду, l oop -обращение и встраивание функций, - это методы, в которых компилятор действительно хорош. Редко, когда их использование в вашем коде явно помогает компилятору лучше выполнять оптимизацию. Я бы предпочел беспокоиться о том, чтобы не допустить такой оптимизации компилятора, написав излишне умный код.

Если у вас есть конкретный пример, я предлагаю вам взглянуть на godbolt . Это хороший инструмент, который может помочь вам увидеть влияние изменений в коде на вывод компилятора.

Также не забывайте знаменитую цитату из D.Knuth:

Программисты тратят огромное количество времени на размышления или беспокойство по поводу скорости некритических частей своих программ, и эти попытки эффективности фактически оказывают сильное негативное влияние при рассмотрении вопросов отладки и обслуживания. Мы должны забыть о малой эффективности, скажем, в 97% случаев: преждевременная оптимизация - это root всего зла. Тем не менее, мы не должны упускать наши возможности в эти критические 3%.

Часто это цитируется как неполное, в то время как последняя часть так же важна, как и остальные: "Однако мы не должны упускать наши возможности в этих критических 3%. ". Чтобы знать, где эти 3%, вы должны профилировать свой код.

TL; DR : Не делать преждевременных оптимизаций. Сначала измерьте и составьте профиль, только тогда вы узнаете, где стоит улучшить, и можете ли вы добиться улучшения вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...