Java IO流 效率測試與分析

2021-08-18 02:34:23 字數 2367 閱讀 1616

效率測試

測試檔案mp4檔案,大小為9,223,457 位元組

1、fileinputstream和fileoutputstream

使用read()和write() 方法進行讀寫:

private

static

void

method1(string srcpath, string destpath) throws ioexception

fos.close();

fis.close();

}

耗時:114850毫秒

使用read(byte b)和write(byte b, int off, int len)方法進行讀寫:

private

static

void

method2(string srcpath, string destpath) throws ioexception

fos.close();

fis.close();

}

耗時:79毫秒

分析:(如若有誤,望指正)

1、我們的檔案都是存在磁碟上的,但是cpu是不會直接操作磁碟的資料,需要先將資料讀到記憶體,然後cpu在記憶體中的操作這部分資料。

2、將資料從磁碟複製到記憶體的過程中,cpu不會閒著,會去處理其他的事情。

3、當執行fileinputstream的read()方法時,cpu會放下正在處理的事情,並對正在處理的事情做好記錄後,去通知io系統讀取乙個位元組到記憶體,然後接著回去處理之前的事情,然後io系統就將這乙個位元組的資料讀取到記憶體。所以每讀取乙個位元組,cpu就會經過一番折騰,才會通知io系統,進行io操作,當檔案特別大的時候,就會消耗很多的時間。假設需要讀取1kb的檔案,cpu就需要通知io系統1024次。

4、當執行fileinputstream的read(byte b)方法是,cpu經過一番的折騰,通知io系統,讀取陣列長度的位元組到記憶體,然後就去幹自己的事情了。假設需要讀取1kb的檔案,我們定義乙個位元組陣列大小為512,此時cpu只需要通知io系統兩次就夠了。

5、write方法的原理差不多

6、當檔案越大時間差越明顯

2、bufferedinputstream和bufferedoutputstream

使用read()和write() 方法進行讀寫:

private

static

void

method3(string srcpath, string destpath) throws ioexception

bos.close();

bis.close();

}

耗時:269毫秒

使用read(byte b)和write(byte b, int off, int len)方法進行讀寫:

private

static

void

method4(string srcpath, string destpath) throws ioexception

bos.close();

bis.close();

}

耗時:19毫秒

分析:(分析的不好,做個簡單的記錄)

1、bufferedinputstream預設在記憶體中開闢乙個8k的快取,也可以通過構造方法設定快取的大小,以預設的8k為例。

2、當執行bufferedinputstream的read()方法時,read()方法雖然是乙個位元組乙個位元組的返回資料,但是如果快取區為空,cpu先讓io系統把快取區填滿,然後才開始返回資料。

3、當執行bufferedinputstream的read(byte b)方法時也一樣,先把快取填滿。

3、當緩衝區一樣大小時

private

static

void

method2(string srcpath, string destpath) throws ioexception

fos.close();

fis.close();

}

共耗時:38毫秒

private

static

void

method4(string srcpath, string destpath) throws ioexception

bos.close();

bis.close();

}

共耗時:41毫秒

當把method2中的緩衝區設為bufferedinputstream的預設大小,即8192個位元組時,兩者的效率會非常接近

參考:

Java IO流 字元流 與 轉換流 詳解

乙個字元字元的讀 只能用來操作文字 不能寫其他格式 寫入字元流的抽象類 實現子類 filewriter 示例 public class demo04 fwriter.write c fwriter.flush fwriter.write c,1,3 fwriter.flush 使用字串直接寫入 fw...

ST Geometry效率的測試與分析

測試環境 資料庫 oracle11g r1 11.1.0.6 64bit 中介軟體 arcsde10 64bit 資料情況 點資料 point,231772條記錄 面資料 poly,12條記錄 如下圖所示 1 st geometry操作符的選擇 測試內容 測試面狀要素所包含的點狀要素的數量以及內容 ...

ST Geometry效率的測試與分析

測試環境 資料庫 oracle11g r1 11.1.0.6 64bit 中介軟體 arcsde10 64bit 資料情況 點資料 point,231772條記錄 面資料 poly,12條記錄 如下圖所示 1 st geometry操作符的選擇 測試內容 測試面狀要素所包含的點狀要素的數量以及內容 ...