У меня есть два (2 ГБ каждого) файла на моем жестком диске и хочу сравнить их друг с другом:
- Копирование исходных файлов с помощью проводника Windows занимает ок. 2-4 минуты (то есть чтение и запись - на одном физическом и логическом диске).
- Чтение с помощью
java.io.FileInputStream
дважды и сравнение массивов байтов по байтам на байт занимает 20 + минут. -
java.io.BufferedInputStream
buffer - 64kb, файлы читаются в кусках, а затем сравниваются. -
Сопоставление выполняется с плотным циклом, например
int numRead = Math.min(numRead[0], numRead[1]); for (int k = 0; k < numRead; k++) { if (buffer[1][k] != buffer[0][k]) { return buffer[0][k] - buffer[1][k]; } }
Что я могу сделать, чтобы ускорить это? Предполагается ли, что NIO быстрее, чем простые потоки? Является ли Java неспособным использовать технологии DMA/SATA и вместо этого выполняет некоторые медленные вызовы OS-API?
EDIT:
Спасибо за ответы. Я сделал несколько экспериментов на их основе. Как показал Андреас
Потокиили подходы
nio
мало чем отличаются.
Более важным является правильный размер буфера.
Это подтверждают мои собственные эксперименты. Поскольку файлы читаются большими кусками, даже дополнительные буферы (BufferedInputStream
) ничего не дают. Оптимизация сравнения возможна, и я получил лучшие результаты с 32-кратным разворачиванием, но время, проведенное в сравнении, невелико по сравнению с чтением диска, поэтому ускорение мало. Похоже, я ничего не могу сделать; - (