999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

淺析Java程序I/O性能的改進策略

2013-12-31 00:00:00錢宇虹
軟件工程 2013年11期

摘 要:程序的I/O性能是影響程序性能的關鍵之一。有效地使用緩沖機制可以極大地提高程序的I/O性能。本文首先對java.io包做了一個簡要的介紹,指出導致I/O性能低下的根本原因,然后循序漸進地采取了三種策略,逐步將I/O性能提高到168倍,這三種策略分別是采用緩沖流,定制自己的緩沖區,定制靜態的固定長度的緩沖區。

關鍵詞:I/O性能;流;緩沖區;分配和回收

中圖分類號:TP311 文獻標識碼:A

Java應用程序都會經常使用java.io包,例如磁盤文件讀寫和通過網絡傳輸數據。然而初學者由于對java.io包的理解的局限性導致編寫的程序I/O性能很差。所幸的是,只要對java.io包有了很好的理解,就可以杜絕這方面的問題,從而保證程序擁有較好的I/O性能。

本文首先對java.io包做一個簡要的介紹,然后指出導致I/O性能低下的根本原因是沒有采用緩沖機制,然后循序漸進地采取了三種策略,將I/O性能逐步提高到168倍,這三種策略分別是采用緩沖流,定制自己的緩沖區,定制靜態的固定長度的緩沖區。

1 I/O操作的基本概念

在Java I/O中最基本的概念是流(Stream),流是一個連續的字節序列,包括輸入流和輸出流,輸入流用來讀取這個序列,而輸出流則用來寫這個序列,在默認情況下Java的流操作是基于字節的,即一次只讀或只寫一個字節。

java.io包提供了InputStream和OutputStream作為對I/O操作的抽象,這兩個接口決定了類層次結構的基本格局。InputStream和OutputStream的具體實現類提供了對不同數據源的訪問,如磁盤文件和網絡連接。

java.io包還提供了過濾流(Filter Stream),過濾流并不指向具體的數據源,而是在其他流之上進行了包裝,這些過濾流其實是java.io包的核心。從性能的角度來看,最重要的過濾流是緩沖流(Buffered Stream),圖1顯示了一個簡化的類層次結構圖。

2 緩沖流

導致I/O性能低下的主要原因是沒有對I/O操作進行緩沖。眾所周知,硬盤擅長于大塊數據的讀寫,但是在小量數據的讀寫上性能不好,所以,為了最大化I/O性能,我們應該選擇批量的數據操作,而緩沖流正是為這個目的設計的。緩沖流,包括BufferedInputStream和BufferedOutputStream, 它為I/O流增加了內存緩沖區,使得Java程序一次可以向底層設備寫入或者讀取大量數據,從而提高了程序的性能。

為了更好地理解緩沖流的效果,請閱讀程序清單一,這個例子采用了原始的文件流實現文件的拷貝。copy方法打開了一個FileInputStream 和一個FileOutputStream,并將數據從一個流直接拷貝到另一個流。由于read和write方法是基于字節的,所以實際的磁盤讀寫也是按字節發生的。實踐證明使用這段代碼拷貝一個8M的文本文件需要花費36750ms。

程序清單一中的copy方法只需稍作修改就能有效地改善性能,如程序清單二所示,它在原始的文件流之上采用了緩沖流BufferedInputStream和BufferedOutputStream,緩沖流將每一個小的讀寫請求積攢起來,然后一次性地批處理,通常是將幾千個讀寫請求合并成一個大的請求。改進后的copy方法拷貝一個8M的文本文件需要花費1187ms,性能大約提高了31倍。

3 建立自己的緩沖

緩沖流雖然在它的內部增加了內存緩沖區,使得在緩沖區和底層設備之間寫入或讀取大量數據成為可能[2,3],但是在這之上Java程序仍舊使用while循環從該流(實際上是緩沖數組)按字節讀寫數據。由于緩沖數組的大小是一定的,JVM需要針對數組做越界檢查,該操作會導致額外的系統開銷。另一方面,為了支持多線程環境,將數據從BufferedInputStream的緩沖數組拷貝到BufferedOutputStream的緩沖數組,其中的方法調用很多都是synchronized, 這也會導致額外的系統開銷。所以盡管程序清單二所示代碼可以有效地改善性能,但是改善的程度仍然不盡人意。

還是利用硬盤擅長讀寫大塊數據這一特性,我們可以自己建立緩沖,以避免上述額外的系統開銷。這需要使用InputStream和OutputStream提供的兩個重載方法,它們允許按字節讀寫,也可以按字節數組讀寫,如下所示:

public int read();

public int read(byte[] bytes);

public int write();

public int write(byte[] bytes);

程序清單三創建了自己的緩沖區,即字節數組byte[] buffer, 其大小是整個文件的字節長度,然后將整個文件一次性讀入內存,再一次性寫到另一個文件。這個代碼非常快,拷貝一個8M的文本文件所花費時間降低到750ms。

注意,使用這個策略需要權衡兩個因素。首先是緩沖區的大小,它所創建的緩沖區的大小等于被拷貝的文件大小,當文件很大時,該緩沖區也會很大。第二,它為每次文件拷貝操作都要創建一個新的緩沖區,當有大量文件需要拷貝時,JVM不得不分配和回收這些大緩沖區內存,這對程序性能是極大的傷害。

如何在保持速度甚至速度更快的前提下避免這兩個缺陷呢?方法是這樣的:創建一個靜態的固定長度的字節數組,如1024*1024字節即1M,每次只讀寫1M的數據。雖然對于大于1M的文件會需要多次讀寫才能完成整個文件的拷貝,但是這樣避免了內存的反復分配和回收。緩沖區大小是可以調整的,針對某個具體的應用場景,我們可以在速度和內存之間取得一個最佳的平衡。

程序清單四的copy方法使用了這樣的1M字節的數組,這個版本表現更為出色,它拷貝一個8M的文本文件所花費時間只有218ms,性能提高了168倍。

值得注意的是代碼中的同步塊,在單線程環境下沒有同步塊是可以的,但是在多線程環境下需要同步塊防止多個線程同時對緩沖區實施寫操作。盡管同步會帶來系統開銷,但是由于while循環的次數很小(8M文件只要循環8次),所以由此帶來的性能損失是可以忽略不計的。實驗證明,有同步塊的版本和去掉同步塊的版本,性能是一樣的。

下表顯示了采取四種不同的策略拷貝一個8M文件所花費的時間。它充分說明,有效地改進緩沖機制可以大大提高程序的I/O性能。

4 結束語

一般情況下,我們總可以為具體的應用程序找到改善I/O性能的方法,這需要具體分析該應用程序的目的和操作特性。例如,考慮FTP和Http服務器,這些服務器的主要工作就是將文件從磁盤拷貝到網絡的Socket,一個網站的主頁通常比其他網頁訪問得更多。為了提高性能,我們可以建立快速緩沖貯存區,將那些經常被訪問的文件做緩存, 這樣這些文件就不必每次從磁盤讀寫,而是直接從內存拷貝到網絡。

參考文獻

[1] What is Java I/O? [EB/OL],http://www.roseindia.net/java/example/java/io/Java_io.shtml

[2] BufferedInputStream,JavaTM Platform Standard Ed. 7 [EB/OL],http://docs.oracle.com/javase/7/docs/api/java/io/BufferedInputStream.html

[3] BufferedOutputStream,JavaTM Platform Standard Ed. 7 [EB/OL],http://docs.oracle.com/javase/7/docs/api/java/io/BufferedOutputStream.html

作者簡介:

錢宇虹(1967-),女,碩士,副教授.研究領域:軟件開發與應用、軟件工程、軟件測試技術方面的教學、科研和開發.

主站蜘蛛池模板: 欧美日本二区| 手机看片1024久久精品你懂的| 国产91特黄特色A级毛片| 欧美日本视频在线观看| 日本91视频| 国产男女XX00免费观看| 手机精品福利在线观看| 亚洲欧美综合精品久久成人网| 日韩精品无码一级毛片免费| 孕妇高潮太爽了在线观看免费| 99久久精品免费视频| 一级毛片免费不卡在线| 国产精鲁鲁网在线视频| 99re热精品视频中文字幕不卡| 欧美色综合久久| 国产理论精品| 这里只有精品免费视频| 女同国产精品一区二区| 欧美中文字幕在线播放| 亚洲国产一成久久精品国产成人综合| 日本免费a视频| 国产免费人成视频网| lhav亚洲精品| 国产精品入口麻豆| 国产女人18毛片水真多1| 国产裸舞福利在线视频合集| 精品国产网| 国产精品久久精品| 热久久这里是精品6免费观看| 亚洲成A人V欧美综合| 日本人妻丰满熟妇区| 免费看一级毛片波多结衣| 久久国语对白| 中文字幕波多野不卡一区| 免费看久久精品99| 99re热精品视频国产免费| 爆乳熟妇一区二区三区| 97国产在线播放| 奇米影视狠狠精品7777| 亚洲精品成人7777在线观看| 色妺妺在线视频喷水| 一级毛片基地| 国产无人区一区二区三区| 五月天综合婷婷| 新SSS无码手机在线观看| 亚洲欧美日韩动漫| 久青草网站| 国产视频自拍一区| 超碰aⅴ人人做人人爽欧美 | 国产真实乱子伦精品视手机观看| 亚洲欧美另类中文字幕| 日本人妻一区二区三区不卡影院| 国产综合色在线视频播放线视| 亚洲AⅤ综合在线欧美一区| 国产精品视频系列专区| 看国产一级毛片| 看你懂的巨臀中文字幕一区二区 | 手机精品视频在线观看免费| 一级毛片免费观看久| 青青久久91| 国产精品亚欧美一区二区三区| 亚洲日韩精品无码专区| 天堂亚洲网| 亚洲福利网址| 亚洲人成网站色7799在线播放| 日本久久网站| 99re在线视频观看| 国产不卡一级毛片视频| 伊人久综合| 婷婷六月在线| 四虎成人在线视频| 2022精品国偷自产免费观看| 国产人妖视频一区在线观看| 99久久国产综合精品2023| 伊人成色综合网| 国产欧美又粗又猛又爽老| 亚洲欧美日本国产专区一区| 亚洲va在线观看| 中文精品久久久久国产网址| 久久亚洲国产最新网站| 亚洲天堂网在线观看视频| 2021国产v亚洲v天堂无码|