2010-12-14 3 views
0

Я использую следующий код для получения контрольной суммы файла. Во время расчетов он использует 50% процессора.Вычислить контрольную сумму MD5 эффективно

MessageDigest md = MessageDigest.getInstance("MD5"); 
InputStream is = new FileInputStream("C:\\Temp\\Small\\Movie.mp4"); // Size 700 MB 

byte [] buffer = new byte [blockSize]; 
int numRead; 
do 
{ 
numRead = is.read(buffer); 
if (numRead > 0) 
{ 
    md.update(buffer, 0, numRead); 
} 
} while (numRead != -1); 

byte[] digest = md.digest(); 

Что можно сделать, чтобы уменьшить код с использования максимальной загрузки процессора, кроме Thread.sleep (мс)

пожеланий, Кингл Рувим J

+1

50% на одном или двухъядерном процессоре? :) я предполагаю ИТС на двухъядерном. – Quamis

+0

@Quamis Итак, ответ заключается в том, чтобы получить больше ядер. –

+0

Я комментирую ваш вопрос, раздел ответов находится на странице. Я пытаюсь понять, что вы, возможно, разместили неверные данные. Кажется, ваш алгоритм вычисляет md5sum файла. Это очень интенсивная задача CPU + disk. Поэтому я предполагаю, что ваш процессор должен быть на 100%. Вы сказали, что 50%, что заставляет меня думать, что у вас есть двухъядерная система, и фактическое использование процессора (core) в этом случае будет 100% – Quamis

ответ

2

Вы можете использовать метод Thread.setPriority(int newPriority), чтобы уменьшить приоритет потока. Это приведет к тому, что другие более высокоприоритетные потоки будут выполняться чаще. Однако ваш MD5 не будет рассчитан так быстро, как если бы вы оставили приоритет в одиночку - почему бы вам не потребоваться, чтобы этот расчет был завершен как можно быстрее?

EDIT: Вот "Fast MD5" implementation, который имеет значительное увеличение производительности (26% быстрее в среднем) по умолчанию java.security.MessageDigest реализации Java. Более подробную информацию см. На странице автора, включая code examples и benchmarks. Код доступен под номером GNU LGPL 2.1 license.

+0

Этот код реализован в Servlet для проверки целостности загруженного файла. От 50 до 100 файлов будут загружаться одновременно на сервер из набора файлов 10k. –

0

Я бы предпочел посвятить управление приоритетом для зева, для окон вы можете начать свое приложение с

start /low your_executable