同じ機能をプログラムするには 2 つの方法があります。
方法 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<#>()
in の機能と同等ですが、テンプレート化されていないものは、コンパイル時に引数の値がわかっている場合にコードで適切な最適化を行うことができるため、 doAction(int value)
よりもやや遅くなります。template<int Value> doAction()
したがって、私の質問は、テンプレート化された関数の場合、数百万行のコードすべてが CPU L1 キャッシュ (およびそれ以上) を埋めるか (したがって、パフォーマンスが大幅に低下するか)、またはdoAction<#>()
現在実行されているループ内の行のみが取得されるかどうかです。キャッシュされた?