我嘗試用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的優勢將更加明顯
您可以使用JMH進行微型基準測試.. – Jayan