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

Вы сравниваете применяемые и апельсины.

Вы сравниваете время поиска и чтения данных через RandomAccessFile со временем к создать отображение через MappedByteBuffer. Создание отображения делает много вещей за кулисами, но не делает никаких операций ввода-вывода.

Что нужно проверить, так это получение данных из байтов 4097-8192 и переписывание его 1024 раз. Не создавайте отображение 1024 раза. Никто в здравом уме не собирается этого делать.

Ваш тест не имеет смысла.

+0

Скорость перезаписи массива должна быть быстрее, чем буфер. Я очень рано экспериментировал с чтением и письмом. RandomAccessFile чтение и запись времени 4 КБ намного меньше, чем MappedByteBuffer. Даже если изменение будет записано снова, RandomAccessFile будет намного короче. – zzjbook

+0

Ничего из этого не отражено в вашем вопросе. Я комментирую код, который вы опубликовали. Мы не можем читать ваши мысли. Общепринятое ускорение для 'MappedByteBuffers' в режиме только для чтения составляет 20%, а в режиме записи - ноль. – EJP

Смежные вопросы