2016-05-14 93 views
-1

我嘗試用java寫一個數據管理工具。 我需要使用高效的隨機文件來讀取和寫入。 我嘗試使用朋友推薦的文件映射。 但效果似乎不太好。 我使用RandomAccessFile以10倍於MappedByteBuffer的速度讀取和寫入文件。JAVA MappedByteBuffer高效率在哪裏?

File file = new File("D:\\testdb"); 
if (!file.exists()) { 
    file.createNewFile(); 
} 
RandomAccessFile accessFile = new RandomAccessFile(file, "rw"); 
accessFile.setLength(65536); 
FileChannel fileChannel = accessFile.getChannel(); 
Random random = new Random(0); 
{ 
    long time = System.nanoTime(); 
    for (int i = 0; i < 1024; i++) { 
     byte[] data = new byte[4096]; 
     accessFile.seek(4096); 
     accessFile.read(data, 0, 4096); 
     accessFile.seek(4096); 
     accessFile.write(data); 
    } 
    System.out.println(System.nanoTime() - time); 
    Thread.sleep(1000); 
} 
{ 
    long time = System.nanoTime(); 
    for (int i = 0; i < 1024; i++) { 
     MappedByteBuffer buffer = fileChannel.map(MapMode.READ_WRITE, 12288, 4096); 
     buffer.force(); 
    } 
    System.out.println(System.nanoTime() - time); 
} 

我想知道MappedByteBuffer的優點在哪裏?

我添加了數據讀取和寫入。花費的時間更加明顯。

{ 
     long time = System.nanoTime(); 
     for (int i = 0; i < 1024; i++) { 
      byte[] data = new byte[4096]; 
      accessFile.seek(4096); 
      accessFile.read(data, 0, 4096); 

      for (int j = 0; j < data.length; j++) { 
       data[j] = data[data.length - j - 1]; 
      } 

      accessFile.seek(4096); 
      accessFile.write(data); 
     } 
     System.out.println(System.nanoTime() - time); 
    } 
    { 
     long time = System.nanoTime(); 
     for (int i = 0; i < 1024; i++) { 
      MappedByteBuffer buffer = fileChannel.map(MapMode.READ_WRITE, 12288, 4096); 

      for (int j = 0; j < buffer.capacity(); j++) { 
       buffer.put(j, buffer.get(buffer.capacity() - j - 1)); 
      } 

      buffer.force(); 
     } 
     System.out.println(System.nanoTime() - time); 
    } 

Output: 
    39655738 
    11786737561 

我試着做數據管理,這裏是緩存。 已經加載到內存中的數據不需要關心。 因爲必須讀取或寫入數據。 結束後必須與文件同步。 如果這些數據未被修改。 不需要同步。 這將進一步節省時間。 RandomAccessFile的優勢將更加明顯

+0

您可以使用JMH進行微型基準測試.. – Jayan

回答

2

您正在比較apply和oranges。

您正在通過RandomAccessFile比較查找和讀取數據的時間與之間的時間,通過MappedByteBuffer創建映射。創建映射會在幕後執行很多事情,但它不會執行任何I/O操作。

你應該測試的是從字節4097-8192獲取數據,並重寫它1024次。不創建映射1024次。沒有人在他們正確的思想中會這樣做。

你的測試沒有意義。

+0

數組的重寫速度必須快於緩衝區。 我一直在做很早就讀寫的實驗。 RandomAccessFile讀寫4KB的時間遠小於MappedByteBuffer。 即使再次寫入更改,RandomAccessFile也會更短。 – zzjbook

+0

這些都不能反映在你的問題中。我正在評論你發佈的代碼。我們無法讀懂你的想法。 「只讀模式下MappedByteBuffers」的普遍接受速度爲20%,寫入模式爲零。 – EJP