测试NIO性能

时间(ms)
文件大小 (byte)
Buffer(byte)
434
603900
10000
0
0
1000
0
46
100
0
188
50
0
281
5
0
2406
1
47
12000

java 代码
 
  1. package com;   
  2.   
  3. import java.io.File;   
  4. import java.io.FileInputStream;   
  5. import java.io.FileOutputStream;   
  6. import java.io.IOException;   
  7. import java.nio.ByteBuffer;   
  8. import java.nio.channels.FileChannel;   
  9.   
  10. import junit.framework.TestCase;   
  11.   
  12. /**  
  13.  * NIO read write test  
  14.  *   
  15.  * @author wutao  
  16.  *   
  17.  */  
  18. public class NioDemo extends TestCase {   
  19.   
  20.     public void testRead() throws IOException {   
  21.   
  22.         int[] sizes = { 1000010001005051 };   
  23.   
  24.         // Arrays.sort(sizes);   
  25.   
  26.         System.out.println(new File("text.txt").length());   
  27.   
  28.         for (int i = 0; i < sizes.length; i++) {   
  29.   
  30.             int size = sizes[i];   
  31.   
  32.             FileInputStream fins = new FileInputStream("text.txt");   
  33.   
  34.             FileChannel fc = fins.getChannel();   
  35.   
  36.             if (!new File("text2.txt").exists()) {   
  37.                 new File("text2.txt").createNewFile();   
  38.             }   
  39.             ByteBuffer buffer = ByteBuffer.allocate(size);   
  40.   
  41.             FileOutputStream fouts = new FileOutputStream("text2.txt");   
  42.             FileChannel fc2 = fouts.getChannel();   
  43.   
  44.             long start = System.currentTimeMillis();   
  45.   
  46.             while (true) {   
  47.                 buffer.clear();   
  48.                 int r = fc.read(buffer);   
  49.                 if (r == -1) {   
  50.                     break;   
  51.                 }   
  52.                 buffer.flip();   
  53.                 fc2.write(buffer);   
  54.             }   
  55.   
  56.             long end = System.currentTimeMillis();   
  57.   
  58.             System.out.println("---------" + size + "---------");   
  59.             System.out.println(end - start);   
  60.             fc.close();   
  61.             fc2.close();   
  62.             fins.close();   
  63.             fouts.close();   
  64.         }   
  65.     }   
  66. }   

 

Java™ I/O, 2nd Edition
By Elliotte Rusty Harold
...............................................
Publisher: O'Reilly
Pub Date: May 2006
Print ISBN-10: 0-596-52750-0
Print ISBN-13: 978-0-59-652750-1
Pages: 726

java 代码
 
  1. import java.io.*;   
  2. import java.nio.*;   
  3. import java.nio.channels.*;   
  4. public class NIOCopier {   
  5.   public static void main(String[] args) throws IOException {   
  6.     FileInputStream inFile = new FileInputStream(args[0]);   
  7.     FileOutputStream outFile = new FileOutputStream(args[1]);   
  8.     FileChannel inChannel = inFile.getChannel( );   
  9.     FileChannel outChannel = outFile.getChannel( );   
  10.     for (ByteBuffer buffer = ByteBuffer.allocate(1024*1024);   
  11.     inChannel.read(buffer) != -1;   
  12.     buffer.clear( )) {   
  13.       buffer.flip( );   
  14.       while (buffer.hasRemaining( )) outChannel.write(buffer);   
  15.     }   
  16.     inChannel.close( );   
  17.     outChannel.close( );   
  18.   }   
  19. }   
  20.   

 

In a very unscientific test, copying one large (4.3-GB) file on one platform (a dual 2.5-GHz PowerMac G5 running Mac OS X 10.4.1) using traditional I/O with buffered streams and an 8192-byte buffer took 305 seconds. Expanding and reducing the buffer size didn't shift the overall numbers more than 5% and if anything tended to increase the time to copy. (Using a one-megabyte buffer like Example 14-1's actually increased the time to over 23 minutes.) Using new I/O as implemented in Example 14-1 was about 16% faster, at 255 seconds. A straight Finder copy took 197 seconds. Using the Unix cp command actually took 312 seconds, so the Finder is doing some surprising optimizations under the hood.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值