2010-12-14 50 views
0

J'utilise le code suivant pour obtenir la somme de contrôle d'un fichier. Il utilise 50% du CPU pendant les calculs.Calculer MD5 Checksum Efficacement

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(); 

Que peut-on faire pour réduire le code de l'utilisation maximale du processeur autre que Thread.sleep (ms)

Cordialement, Kingsley Reuben J

+1

50% sur un seul ou cpu dual core? :) Je devine que son sur un dual core. – Quamis

+0

@Quamis Donc, la réponse est d'obtenir plus de noyaux. –

+0

Je commente sur votre question, la section des réponses est en bas de la page. J'essaie de dire que vous avez peut-être publié des données erronées. Votre algorithme semble calculer le md5sum d'un fichier. C'est une tâche CPU + disque très intensive. Donc, je suppose que votre processeur devrait être 100%. Vous avez dit 50%, ce qui me conduit à penser que vous avez un système dual core, et l'utilisation réelle de cpu (core) dans ce cas serait 100% – Quamis

Répondre

2

Vous pouvez utiliser la méthode Thread.setPriority(int newPriority) pour réduire la priorité du fil. Cela entraînera l'exécution d'autres threads de priorité plus élevée plus souvent. Cependant, votre MD5 ne sera pas calculé aussi rapidement que si vous aviez laissé la priorité seule - pourquoi ne voudriez-vous pas que ce calcul se termine aussi vite que possible?

EDIT: Voici un "Fast MD5" implementation, qui bénéficie d'une augmentation significative de la performance (26% plus rapide en moyenne) par rapport à défaut java.security.MessageDigest mise en œuvre de Java. Voir la page de l'auteur pour des informations détaillées, y compris code examples et benchmarks. Le code est disponible sous le GNU LGPL 2.1 license.

+0

Ce code est implémenté dans une servlet pour vérifier l'intégrité du fichier téléchargé. 50 à 100 fichiers seront téléchargés simultanément sur le serveur à partir d'un ensemble de 10k fichiers. –

0

Je préfère dédier la gestion de la priorité à l'os, pour Windows, vous pouvez commencer votre application avec

start /low your_executable