2016-06-11 69 views
1

我有填充有下列結構一個std::vector迭代速度和元件大小

#define ELEMENTSIZE 8 

struct Element { 
int value; 
char size[ELEMENTSIZE - 4]; //1 char is 1B in size - 4B int 
}; 

結構的大小取決於所定義elementsize,這使得在結構指定大小的字符數組。

我是基準向量中的這些結構的平均值,我很想知道爲什麼向量填充更大的結構體積需要更長的時間來迭代。

例如,具有1 000 000個8B結構的矢量需要大約17ms,並且具有128個結構12.7ms的相同測試。

僅因緩存而存在很大差異嗎?如果是這樣,你能解釋爲什麼嗎?還是還有其他方面我看不到?

回答

0

結構是16倍大,所以它應該花16倍的時間來遍歷。在數學上12,7/1,7 = 7,47倍,所以它幾乎匹配數學。

現在想象一下,包含128B元素的結構是包含8B元素的結構,但尺寸相同。你現在看到它真的是16倍大嗎?

0

操作系統必須使更大的結構在存儲器中,這可能需要此路徑:

  • 從虛擬存儲器到主存儲器(L4)
  • 從主存儲器到L3,以及L2和L1直到處理器(如果需要處理)
  • 在L1或處理器級別,內容必須圍繞正在使用的iterator對象被複制。它很大程度上取決於緩存性能。
  • 現在每次迭代時,它都取決於您使用迭代器執行的操作。如果正在複製內容或在屏幕上顯示內容,則需要執行一些排序/壓縮更多的時間(如果需要,則從CPU到L4)。

如果發生所有這些情況,爲什麼128結構不會比8字節結構佔用更多時間?

+0

好吧,這聽起來很合理。但是,如果我看起來更深一點,矢量是存儲器中的連續存儲器。所以我想,當我遍歷矢量時,處理器應該在緩存中有下一個迭代。我有一個64x處理器,並且更大的結構需要更多的操作來處理(可以說3倍多的操作),但爲什麼這個延遲很大?我錯過了什麼? – AdamT

+0

在硬件級別更多的數據將被移動。您不能說4個字節,4MB複製需要相同的時間。 – Ajay