2016-05-06 33 views
0

假設有一個函數需要調用數百萬次。由這個函數執行的算術運算並不那麼繁重,所以唯一重要的是所有變量的分配速度有多快。我們還假定變量總是在堆棧上分配。 最簡單的情況下,例如:使用大型本地變量優化頻繁調用的函數(C++)

void doSomething(){ 
    int aReallyLargeVariable[10000]; 
    ...performing a few light operations on that variable and returning nothing... 
} 

我知道,當函數返回的所有它的變量被破壞,所以
豈不是更好地使其靜態或全局緩存此變量?什麼是優化它的最佳方式?

+1

使變量成爲該函數的一個參數並對許多函數調用使用相同的變量? – rozina

+0

是遞歸調用還是併發調用? –

+1

而且 - 既然你已經意識到了其他設計,你可以在比較中分享你的基準測試結果,你肯定已經運行了? –

回答

3

這不是會導致性能問題的分配。問題是初始化,所以當

int aReallyLargeVariable[10000]; 

不會花很多時間

int aReallyLargeVariable[10000] = {0}; 

會做。還動態創建巨大的對象可能會導致問題。

如果你有一個功能不是很重的邏輯,並且只使用原始類型,只需將其定義爲inline並且不用擔心性能。

如果您需要定義對象的大額考慮其他的數據結構像stackvector不會需要有1000種以上的元素

1

優化這個功能,考慮到它被稱爲很多次,第一步必須是do not declare the large variable locally。當你這樣做時,會發生一些事情:

  • 由於您在本地聲明瞭陣列並且可能只使用了一些值,所以很多堆棧空間被浪費了。
  • 由此聲明引起的堆棧操作(push/pop)可能超過了該函數必須執行的實際工作。

你最好把這個數組聲明在別的地方(如果你必須聲明的話)並傳遞一個指向數組的指針。這樣您也可以重新使用內存,而不是浪費時間重新分配。

+0

正如m.antkowicz所說,堆棧操作本身(push/pop)所需的時間不受局部變量大小的影響;這些操作只是改變一個寄存器值。 –