1. 程式人生 > >Android|Java 寫檔案優化(使用緩衝區)

Android|Java 寫檔案優化(使用緩衝區)

對於不使用快取讀寫檔案的操作(1M大小):

                    FileOutputStream fos = new FileOutputStream(file);
//                  BufferedOutputStream bos = new BufferedOutputStream(fos);
                    for (int i = 0; i < SIZE; i++) {
                        fos.write(bytes[i]);
                    }

                    FileInputStream fis = new
FileInputStream(filename); // BufferedInputStream bis = new BufferedInputStream(fis); int readedByte; while ((readedByte = fis.read()) != -1) { }

write file cost time = 8164
Background partial concurrent mark sweep GC freed 903151(13MB) AllocSpace objects, 0(0B) LOS objects, 40% free, 21MB/35MB, paused 825us total 126.337ms
read file cost time=5067

如果使用快取:

                    FileOutputStream fos = new FileOutputStream(file);
                    BufferedOutputStream bos = new BufferedOutputStream(fos);
                    for (int i = 0; i < SIZE; i++) {
                        bos.write(bytes[i]);
                    }

                    FileInputStream fis = new
FileInputStream(filename); BufferedInputStream bis = new BufferedInputStream(fis); int readedByte; while ((readedByte = bis.read()) != -1) { }

這個時候可以看到:
write file cost time = 67 寫檔案相差128倍數
read file cost time=125 讀檔案相差40倍

效能相差如此之大,因為讀寫檔案涉及到磁碟IO,也就是記憶體和外部儲存裝置之間的資料操作,我們知道記憶體的讀寫速度是遠遠高於外部裝置的讀寫速度的,所以使用快取,可以先在記憶體內高速讀寫一塊快取區,待快取區寫滿後,再一次性的寫入到外部儲存裝置,這樣可以大大減少記憶體和外部儲存裝置的互動次數,從而節省時間;

類似的快取提高效能的技巧,比如:圖片快取,網路快取,資料庫連結池,執行緒池,計算結果快取,等等,都能快速的提高執行速度!

至於原理,我從其他地方搬運來的,我認為這個解釋比較容易理解:
呼叫I\O操作的時候,實際上還是一個一個的讀或者寫,關鍵就在,CPU只有一個,不論是幾個核心。CPU在系統呼叫時,會不會還要參與主要操作?參與多次就會花更多的時間。
系統呼叫時,若不用緩衝,CPU會酌情考慮使用 中斷。此時CPU是主動地,每個週期中都要花去一部分去詢問I\O裝置是否讀完資料,這段時間CPU不能做任何其他的事情(至少負責執行這段模組的核不能)。所以,呼叫一次讀了一個字,通報一次,CPU騰出時間處理一次。
而設定緩衝,CPU通常會使用 DMA 方式去執行 I\O 操作。CPU 將這個工作交給DMA控制器來做,自己騰出時間做其他的事,當DMA完成工作時,DMA會主動告訴CPU“操作完成”。這時,CPU接管後續工作。在此,CPU 是被動的。DMA是專門 做 I\O 與 記憶體 資料交換的,不僅自身效率高,也節約了CPU時間,CPU在DMA開始和結束時做了一些設定罷了。
所以,呼叫一次,不必通報CPU,等緩衝區滿了,DMA 會對C PU 說 “嘿,夥計!快過來看看,把他們都搬走吧”。
綜上,設定緩衝,就建立了資料塊,使得DMA執行更方便,CPU也有空閒,而不是呆呆地候著I\O資料讀來。從微觀角度來說,設定緩衝效率要高很多。儘管,不能從這個程式上看出來。 幾萬字的讀寫\就能看到差距