2012-04-05 95 views
1

有沒有做這樣的事情之間的性能差異:C中的static關鍵字可以用來提高性能嗎?

void function() { 
char bufgfer[256]; 
// ... 
} 

void function() { 
static char bufgfer[256]; 
// ... 
} 

我知道這改變了功能的工作方式,但如何表現?第二個更快?

hanks

+0

理論上是的,因爲緩衝區可能只會被分配一次,但第一個只是堆棧中的減法,如果這個函數被調用了很多次,那麼這個減法只會被真正注意到。 – RedX 2012-04-05 12:00:42

+1

它可能有時,有時它可能會更慢,它取決於函數中的其他變量,訪問是什麼。 – MByD 2012-04-05 12:00:43

+1

@RedX - 這並不準確。在堆棧上的分配可能是對堆棧指針的簡單改變,並且如果還有其他變量,則可以在相同的改變中完成。如果您在堆棧中有一些變量並且有一個靜態變量,那麼它們的位置差異可能會降低性能。 – MByD 2012-04-05 12:02:50

回答

2

如果緩衝區結束於CPU附近的緩存中,第一個可能會更快。

如果您認爲第一個緩慢,因爲在運行時會以某種方式分配緩衝區,那麼不,這不是原因。所有這些都由編譯器在編譯時處理。而且,使緩衝區靜態可能會使其不在緩存中。 (但誰知道,還是在乎?)

在我看來,你正在考慮過早的優化。

+0

感謝這是我正在尋找的答案:我認爲不必爲每個函數調用在堆棧上創建緩衝區會更快,顯然我錯了 – lezebulon 2012-04-05 19:15:40

2

它可能有時是,有時可能會更慢,它取決於函數中的其他變量,以及訪問是什麼。

最重要的是在需要時使用它,而不是在優化方面,而是在功能方面。如果你不需要一個變量是靜態的,那麼它不應該是這樣的,大多數情況下,不同平臺上的影響是不相關的。

2

切勿根據性能選擇對象的存儲時間(靜態與自動)。存儲持續時間不是出於性能目的而存在,而是因爲它們具有嚴重不同的語義;將緩衝區設置爲靜態會極大地破壞代碼的大量潛在用途,最明顯的是多線程用法。對象應該具有靜態存儲持續時間的唯一時間是存儲需要在調用之間保持的長期全局狀態,即使此時通常是設計錯誤(此狀態應保存在調用方保持的上下文中)。如此一來,靜態存儲時間的性能不太可能會更好,並且在很多情況下(尤其是PIC共享庫或PIE可執行文件)訪問靜態變量的速度會比訪問靜態變量慢,因爲函數必須加載GOT寄存器(如果它尚未加載)並執行GOT間接尋址或GOT相關尋址。

相關問題