java 写文件之性能测试

本文通过对比DataOutputStream、FileWriter、FileChannel及BufferedOutputStream在文件写入操作中的性能表现,探讨不同I/O操作方式对性能的影响。

今天又做了个性能测试,这次加入了BufferedOutputStream和FileChannel,测试发现了一个很奇怪的现象,加了buffer和用nio的性能并没有得到什么改善,而且偶尔还慢了,不知所因,求大牛们解答?

测试代码:

import java.io.*; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class FileTester { private DataOutputStream os; private FileWriter fw; String s = "测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n测试测试测试测试/n"; private byte[] data = s.getBytes(); int len = data.length; public void test() throws IOException { // System.out.println(data.length); os = new DataOutputStream(new FileOutputStream("D://test1.txt")); BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(new File("D://test2.txt"))); fw = new FileWriter(new File("D://test3.txt")); FileChannel fc = new FileOutputStream(new File("D://test4.txt")) .getChannel(); ByteBuffer bb = ByteBuffer.allocate(510); long time1 = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { os.write(data); } os.flush(); os.close(); long time2 = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { fw.write(s); } fw.flush(); fw.close(); long time3 = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { bb.clear(); bb.put(data); // System.out.println(bb.position()); bb.flip(); fc.write(bb); } fc.close(); long time4 = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { // bos.write(data); bos.write(data, 0, len); } bos.flush(); bos.close(); long time5 = System.currentTimeMillis(); System.out.println("time1:" + (time2 - time1)); System.out.println("time2:" + (time3 - time2)); System.out.println("time3:" + (time4 - time3)); System.out.println("time4:" + (time5 - time4)); } public static void main(String[] args) throws IOException { FileTester f = new FileTester(); f.test(); } }

测试结果:

//bos.write(data);的测试结果 time1:2390 time2:4344 time3:5437 time4:5391 time1:2812 time2:1625 time3:1547 time4:1407 time1:2281 time2:1188 time3:2500 time4:2297 time1:2250 time2:1453 time3:1547 time4:1437 time1:1782 time2:2047 time3:1484 time4:1719 time1:1641 time2:1328 time3:1422 time4:1562 time1:1765 time2:1313 time3:1390 time4:1610 /***************漂亮的分割线**************/ /* *把bos.write(data);换成bos.write(data, 0, len);后的测试结果 */ time1:2078 time2:2187 time3:1844 time4:1688 time1:4453 time2:1516 time3:5313 time4:1421 time1:2250 time2:1391 time3:1468 time4:1860 time1:2282 time2:1656 time3:1703 time4:1281

测试环境:windows xp + jdk1.5+eclipse3.2

电脑联想台式,1G内存。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值