У меня есть два способа запрограммировать одну и ту же функциональность.
Способ 1:
doTheWork(int action)
{
for(int i = 0 i < 1000000000; ++i)
{
doAction(action);
}
}
Способ 2:
doTheWork(int action)
{
switch(action)
{
case 1:
for(int i = 0 i < 1000000000; ++i)
{
doAction<1>();
}
break;
case 2:
for(int i = 0 i < 1000000000; ++i)
{
doAction<2>();
}
break;
//-----------------------------------------------
//... (there are 1000000 cases here)
//-----------------------------------------------
case 1000000:
for(int i = 0 i < 1000000000; ++i)
{
doAction<1000000>();
}
break;
}
}
Предположим, что функция doAction(int action)
и функция template<int Action> doAction()
состоят примерно из 10 строк кода, которые будут встроены во время компиляции. Вызов doAction(#)
эквивалентен doAction<#>()
по функциональности, но нешаблонный doAction(int value)
несколько медленнее, чем template<int Value> doAction()
, поскольку в коде можно выполнить некоторые приятные оптимизации, когда значение аргумента известно во время компиляции.
Итак, мой вопрос: все ли миллионы строк кода заполняют кеш ЦП L1 (и больше) в случае шаблонной функции (и, таким образом, значительно снижают производительность), или только строки doAction<#>()
внутри выполняемого в данный момент цикла попасть в кеш?