2016-05-14 58 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