第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當(dāng)使用FileInputStream時,如何確定理想的緩沖區(qū)大?。?/h1>

當(dāng)使用FileInputStream時,如何確定理想的緩沖區(qū)大???

慕村225694 2019-07-22 16:45:30
當(dāng)使用FileInputStream時,如何確定理想的緩沖區(qū)大?。课矣幸粋€從文件創(chuàng)建MessageDigest(散列)的方法,我需要對很多文件(>=100,000)這樣做。我應(yīng)該使用多大的緩沖區(qū)從文件中讀取以最大限度地提高性能?大多數(shù)人都熟悉基本代碼(我將在這里重復(fù)一遍,以防萬一):MessageDigest md = MessageDigest.getInstance( "SHA" );FileInputStream ios = new FileInputStream( "myfile.bmp" );byte[] buffer = new byte[4 * 1024]; // what should this value be?int read = 0;while( ( read = ios.read( buffer ) ) > 0 )     md.update( buffer, 0, read );ios.close();md.digest();最大吞吐量緩沖區(qū)的理想大小是多少?我知道這與系統(tǒng)有關(guān),我很確定它的操作系統(tǒng),文件系統(tǒng),和硬盤依賴,也許還有其他硬件/軟件的混合。(我應(yīng)該指出,我對Java有點陌生,所以這可能只是一些我不知道的JavaAPI調(diào)用。)
查看完整描述

3 回答

?
子衿沉夜

TA貢獻(xiàn)1828條經(jīng)驗 獲得超3個贊

最佳緩沖區(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))。


查看完整回答
反對 回復(fù) 2019-07-22
?
慕妹3146593

TA貢獻(xiàn)1820條經(jīng)驗 獲得超9個贊

是的,它可能取決于各種事情-但我懷疑它會有很大的區(qū)別。我傾向于選擇16K或32K作為內(nèi)存使用和性能之間的良好平衡。

請注意,在代碼中應(yīng)該有一個try/Finish塊,以確保即使拋出異常也關(guān)閉流。


查看完整回答
反對 回復(fù) 2019-07-22
?
慕標(biāo)琳琳

TA貢獻(xiàn)1830條經(jīng)驗 獲得超9個贊

在大多數(shù)情況下,這并不重要。只要選擇一個好的大小,如4K或16K,并堅持它。如果你陽性這是應(yīng)用程序中的瓶頸,那么您應(yīng)該開始分析以找到最佳的緩沖區(qū)大小。如果您選擇的大小太小,則會浪費時間進(jìn)行額外的I/O操作和額外的函數(shù)調(diào)用。如果您選擇一個太大的大小,您將開始看到許多緩存缺失,這將真正減慢您的速度。不要使用大于L2緩存大小的緩沖區(qū)。


查看完整回答
反對 回復(fù) 2019-07-22
  • 3 回答
  • 0 關(guān)注
  • 1640 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號