我有代碼看起來像這樣:可以重複調用相同的函數來提供更好的性能嗎?
void foo(unsigned long k)
{
if (k & 1)
{
bar(k/2 + 1);
bar(k/2);
bar(k/2 + 1);
}
else
{
bar(k/2);
bar(k/2);
bar(k/2);
}
}
void bar(unsigned long k)
{
switch(k)
{
case default: special_default(); break;
case 1: specialbar1(); break;
case 2: specialbar2(); break;
<more cases>
case 16: specialbar16(); break;
}
}
的表現要好得多時foo
被調用的k
偶數值。每個specialbar#()
方法使用多個堆棧變量,這些變量的數量隨着k
的增加而急劇增加。要清楚specialbar#()
使用約3 * k
局部變量都是unsigned long long
變量。
例如foo(32)
執行比foo(31)
快約15%。我使用Visual Studio 2012和性能分析向我保證,兩次調用specialbar16
和一個呼叫specialbar15
花費的時間比連續三次調用specialbar16
相當多的工作。
是否有可能編譯器會連續三個電話的優勢,當k
是什?也就是說,是否可以意識到,即使在k
的連續三次調用中,堆棧基本上都是相同的,但對於奇數k
,相同的優化是不可能的?
你是不是真的測量同樣的事情,因爲你是調用不同的'specialbar_k()'在每種情況下的功能,他們可能做不同的事情。 – interjay