我有两种方法来编写相同的功能。
方法一:
doTheWork(int action)
{
for(int i = 0 i < 1000000000; ++i)
{
doAction(action);
}
}
方法二:
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()
,因为在编译时已知参数值时可以在代码中进行一些很好的优化。
所以我的问题是,在模板化函数的情况下,是否所有数百万行代码都填充了 CPU L1 缓存(以及更多)(从而大大降低了性能),还是只有doAction<#>()
当前正在运行的循环内部的行得到缓存?