最佳緩沖區(qū)大小與許多因素有關(guān):文件系統(tǒng)塊大小、CPU緩存大小和緩存延遲。
大多數(shù)文件系統(tǒng)配置為使用4096或8192的塊大小。理論上,如果您配置了緩沖區(qū)大小,以便比磁盤塊多讀幾個字節(jié),那么對文件系統(tǒng)的操作可能效率極低(也就是說,如果您將緩沖區(qū)配置為一次讀取4100字節(jié),則每次讀取都需要由文件系統(tǒng)讀取2個塊)。如果塊已經(jīng)在緩存中,那么您將付出RAM->L3/L2緩存延遲的代價。如果您運(yùn)氣不好,而且塊還沒有在緩存中,那么您也要支付磁盤->RAM延遲的代價。
這就是為什么大多數(shù)緩沖區(qū)大小為2的原因,并且通常大于(或等于)磁盤塊大小。這意味著您的流讀取可能導(dǎo)致多個磁盤塊讀取-但這些讀取將始終使用一個完整的塊-沒有浪費讀取。
現(xiàn)在,在一個典型的流場景中,這被抵消了很大一部分,因為當(dāng)您進(jìn)入下一次讀取時,從磁盤讀取的塊仍將在內(nèi)存中(畢竟,我們在這里進(jìn)行順序讀取)-所以您在下一次讀取時最終支付的是RAM->L3/L2緩存延遲價格,而不是磁盤->RAM延遲。就大小而言,磁盤->RAM延遲太慢,幾乎淹沒了您可能處理的任何其他延遲。
因此,我懷疑如果您運(yùn)行了一個具有不同緩存大小的測試(還沒有親自這么做),您可能會發(fā)現(xiàn)緩存大小會對文件系統(tǒng)塊的大小產(chǎn)生很大的影響。除此之外,我懷疑事情會很快穩(wěn)定下來。
有一個噸這里的情況和例外-系統(tǒng)的復(fù)雜性實際上是相當(dāng)驚人的(僅僅得到一個處理L3->L2緩存?zhèn)鬏斒橇钊穗y以置信的復(fù)雜,它改變了每一種CPU類型)。
這就引出了“現(xiàn)實世界”的答案:如果你的應(yīng)用程序是99%,設(shè)置緩存大小為8192并繼續(xù)前進(jìn)(更好的是,選擇封裝而不是性能,并使用BufferedInputStream隱藏細(xì)節(jié))。如果您所處的應(yīng)用程序中的1%高度依賴磁盤吞吐量,那么就可以完成您的實現(xiàn),這樣您就可以交換不同的磁盤交互策略,并提供旋鈕和撥號,讓用戶能夠測試和優(yōu)化(或者想出一些自我優(yōu)化的系統(tǒng))。