Сохранение файлов программно в RAM-диске ImDisk не быстрее - PullRequest
1 голос
/ 11 апреля 2020

Я создал 256 МБ ОЗУ с использованием ImDisk и сравнил скорости чтения / записи жесткого диска и оперативного диска с помощью простого программного обеспечения для тестирования CrystalDiskMark . CrystalDiskMark показывает, что RAM-диск в 10 раз быстрее жесткого диска, как и следовало ожидать.

Однако я попытался сохранить данные программно на RAM-диске и HDD, ожидая, что RAM-диск Быстрее, и для обоих времени требуется одинаковое.

Я написал следующий код в Java, создал исполняемый файл JAR и запустил исполняемый файл на жестком диске и RAM-диске. Этот код создает черное изображение размером 16x16, сохраняет 100 различных его копий в формате PNG и печатает в терминале время, необходимое для сохранения каждого файла, среднее значение и общее время.

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;

public class SaveImageSpeedTest {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        BufferedImage img = new BufferedImage(16, 16, BufferedImage.TYPE_3BYTE_BGR);

        long n = 100;
        long total_time = 0;
        for(long i=0; i<n; i++) {
            try {
                long time = System.nanoTime();
                ImageIO.write(img, "PNG", new File(i+".png"));
                time = System.nanoTime()-time;
                total_time += time;
                System.out.println((i+1)+"/"+n+" - "+"Time: "+(time/1000000L)+" ms");
            } catch (Exception ex) {
                Logger.getLogger(SaveImageSpeedTest.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        long average_time = total_time/n;
        System.out.println();
        System.out.println("Total time: "+(total_time/1000000L)+" ms");
        System.out.println("Average time: "+(average_time/1000000L)+" ms");
    }
}

Как это сделать это возможно? Почему не быстрее, если тест показывает, что RAM Disk в 10 раз быстрее? Я также попытался сохранить данные с помощью исполняемого файла C ++, и снова времена были такими же.

Редактировать 1: Изменяя формат RAM Disk с NTFS на FAT, я получаю почти в два раза больше скорости, но это должно быть в 10 раз больше.

Редактировать 2: Я пробовал изображения разных размеров и даже делал случайные изображения (чтобы избежать кэширования данных). Всегда одни и те же результаты: Ram DISK едва ли в два раза быстрее.

1 Ответ

2 голосов
/ 11 апреля 2020

Когда вы записываете в файл, еще не означает , что данные фактически записываются на диск. Операционные системы обычно используют буферный кеш для отсрочки записи на устройство.

Итак, ваш тест в основном измеряет производительность кодирования изображений плюс запись в буферный кеш. Если вы хотите измерить фактический ввод / вывод устройства, тест производительности должен по крайней мере включать FileChannel.force (который вызывает fsync под капотом).

Кроме того, исключите кодирование изображения из эталонного теста, поскольку это также может занять значительное время.

...