作者dryman (dryman)
看板java
标题[分享] java nio performance tuning
时间Thu Oct 3 13:44:58 2013
http://www.idryman.org/blog/2013/09/28/java-fast-io-using-java-nio-api/
最近换工作,开始写hadoop & java
学了一些新东西就开始写java相关的部落格文章了
这一篇是我用java nio把一个资料读取的时间从194秒压到0.16秒
底层API的威力果然不同凡响啊...
简而言之,java nio是 New IO 的缩写
里面支援bulk copy还有asynchronous read/write
如果有用C写过fread, fseek, rewind等功能的话
对nio的介面应该会感到相当熟悉
我只有用到基本的bulk copy
进阶的mmap或是async io因为效能目标已经达到就没研究了
范例code长这样:(syntax highlight请进blog看)
public static void readIPFromNIO() throws IOException{
FileInputStream fis = new FileInputStream(new File("ip.bin"));
FileChannel channel = fis.getChannel();
ByteBuffer bb = ByteBuffer.allocateDirect(64*1024);
bb.clear();
ipArr = new int [(int)channel.size()/4];
System.out.println("File size: "+channel.size()/4);
long len = 0;
int offset = 0;
while ((len = channel.read(bb))!= -1){
bb.flip();
//System.out.println("Offset: "+offset+"\tlen: "+len+"\tremaining:"+bb.hasRemaining());
bb.asIntBuffer().get(ipArr,offset,(int)len/4);
offset += (int)len/4;
bb.clear();
}
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 108.205.154.230
1F:推 gmoz:推NIO o_o 10/03 14:25
2F:→ gmoz:比较旧的CPU是不是没有DMA? 10/03 14:29
3F:→ iterator:要不要再想想看, 你前两个比较组是不是真的那麽慢? 10/03 16:25
4F:→ iterator:消耗的时间,真的都在於 java.io 与 java.nio 的差距上吗? 10/03 16:27
5F:→ sbrhsieh:这样的数据真的有点耸动,我认为几十倍的差距还是有的 10/03 16:32
6F:推 cowbaying:1212倍... 10/03 16:42
7F:推 AI3767:NIO看来不错用 ^^ 10/04 01:50
8F:推 jerry74:NIO是non-blocking IO 不是New IO... 10/06 16:08
9F:推 popcorny:NIO确实是New IO唷 10/06 17:05
10F:→ Killercat:大多数人用nio package都是为了non blocking才有此误解 10/08 19:54
11F:→ Killercat:我自己也是误解了很长一段时间 XD nio包内很多东西 10/08 19:55