Ява — Повторные записи на диск

Мне нужно написать список слов в файл, а затем сохранить файл на диске. Является ли один из следующих двух способов лучше, чем другой? Второй, очевидно, использует больше основной памяти, но есть ли разница в скорости?

(это просто псевдокод)

for i = 0 to i = n:
word = generateWord();
FileWriter.println(word);
end loop

против

String [] listOfWords = new List
for i = 0 to i = n:
word = generateWord();
listOfWords.add(word)
end loop
for i = 0 to n:
FileWriter.println(listOfWords[i]);
end loop

0

Решение

Эти два метода, которые вы показываете, абсолютно одинаковы с точки зрения эффективности использования диска.

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

Если используемый вами объект является одним из тех, которые записывают точные данные, которые вы ему сообщаете, тогда ваш способ записи очень неэффективен. Вам следует подумать о переключении на другого записывающего устройства (например, BufferedWriter) или создании более длинной строки перед ее записью.

В общем, вы должны пытаться записывать данные в чанках, которые соответствуют размеру чанка диска.

2

Другие решения

Между вашим кодом и диском у вас есть что-то вроде стека: код библиотеки Java, среда выполнения виртуальной машины, библиотека времени выполнения C, кеш файловой подсистемы / подсистема виртуальной памяти, планировщик ввода-вывода операционной системы, драйвер устройства и прошивка физического диска.

Просто сделайте самую простую вещь, если только профилирование не покажет проблему. Некоторые из этих слоев уже будут настроены для обработки буферизации, пакетной обработки и планирования последовательной записи, поскольку они являются таким распространенным вариантом использования.

1

От FileWriterС точки зрения, вы делаете абсолютно одинаковую вещь в обоих примерах, поэтому ясно, что не может быть никакой разницы в отношении файлового ввода-вывода. И, как вы говорите, сложность первого пространства O (1), а не O (N) второго.

0
По вопросам рекламы [email protected]