作者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
推 gmoz:推NIO o_o 10/03 14:25
→ gmoz:比較舊的CPU是不是沒有DMA? 10/03 14:29
→ iterator:要不要再想想看, 你前兩個比較組是不是真的那麼慢? 10/03 16:25
→ iterator:消耗的時間,真的都在於 java.io 與 java.nio 的差距上嗎? 10/03 16:27
→ sbrhsieh:這樣的數據真的有點聳動,我認為幾十倍的差距還是有的 10/03 16:32
推 cowbaying:1212倍... 10/03 16:42
推 AI3767:NIO看來不錯用 ^^ 10/04 01:50
推 jerry74:NIO是non-blocking IO 不是New IO... 10/06 16:08
推 popcorny:NIO確實是New IO唷 10/06 17:05
→ Killercat:大多數人用nio package都是為了non blocking才有此誤解 10/08 19:54
→ Killercat:我自己也是誤解了很長一段時間 XD nio包內很多東西 10/08 19:55