JAVA MappedByteBuffer哪里效率很高?

时间:2016-05-14 07:05:29

标签: java io

我尝试使用java编写数据管理工具。 我需要使用高效的随机文件来读写。 我尝试使用朋友推荐的文件映射。 但效果似乎并不好。 我使用RandomAccessFile以比MappedByteBuffer快10倍的速度读写文件。

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的优势将更加明显

1 个答案:

答案 0 :(得分:2)

您正在比较apply和oranges。

您正在通过IN.Tags.Share.handleCount比较查找和读取数据的时间,以及通过RandomAccessFile 创建映射的时间。创建映射会在幕后执行很多操作,但它不会执行任何I / O.

您应该测试的是从字节4097-8192获取数据,并重写1024次。没有创建1024次映射。没有人能够做到这一点。

你的测试没有意义。