2013-04-26 3 views
2

Je cours quelques tests pour mon projet écrit en Java, sur les images. J'ai un résultat intéressant et je n'arrive pas à comprendre pourquoi. Voici les lignes d'initialisation de BufferedImage et Image.Pourquoi BufferedImage est-il initialisé plus vite que Image

File[] files = new File("C:\\Users\\SAMSUNG\\Desktop\\img\\").listFiles(); 
time = System.currentTimeMillis(); 
for (File f:files){ 
    Image img = ImageIO.read(f); 
} 
System.out.println((System.currentTimeMillis() - time) + " miliseconds."); 

PRENEZ GARDE: Ces deux opérations sont gérées séparément. Je cours le dessus, le processus se termine, je veux dire en réalité se tue finit, que je cours le dessous. Je suis conscient que l'exécution de ceux-ci dans une course peut affecter les résultats que j'essaye d'atteindre les mêmes fichiers, pour que je les exécute séparément. Les résultats sont près de 40 minutes. Cependant, l'initialisation BufferedImage est toujours une minute plus rapide que l'initialisation Image. Pourquoi donc? Je fais les tests trois fois et le résultat est le même.

+1

Ce test n'est pas valide, vous appelez la même méthode mais vous l'affectez avec un type différent. –

+0

Vous pouvez également constater que la première boucle met en cache les résultats d'image dont la deuxième boucle profite (sans avoir besoin de relire l'image) – MadProgrammer

+0

Il n'y a aucune différence dans l'initialisation. Tout ce qui est différent est le type de référence auquel vous attribuez le résultat de 'ImageIO.red (f)'. La raison a été donnée par iluxa: lorsque la deuxième boucle est lancée, hotspot a déjà eu la chance d'optimiser le code. – Axel

Répondre

7

Les temps doivent être identiques. Je soupçonne que votre première boucle réchauffe des caches avec le contenu des fichiers, et la seconde boucle est plus facile.

Essayez d'inverser l'ordre de lecture: d'abord BufferedImages, puis Images et vérifier ce qui se passe

+0

"Je suis conscient que l'exécution de ceux-ci dans une course peut affecter les résultats que j'essaie d'atteindre les mêmes fichiers, pour cela je les lance séparément." Je colle le code complet. –

+0

Encore. Les caches de disque dur sont aussi une chose. Le test le plus concluant ressemblerait à ceci: redémarrez l'ordinateur, exécutez 1 version, redémarrez-le à nouveau, exécutez le second. – iluxa

+0

Je lance l'image, que je cours BufferedImage (disons qu'il est mis en cache), je réexécute Image, que je cours BufferedImage. J'ai les mêmes résultats. De toute façon, je vais essayer et afficher les résultats. –

0

Tout d'abord, assurez-vous faire plus d'une exécution d'un essai comme ça (c.-à-coller toute la boucle dans une boucle), deuxièmement, utilisez System.NanoTime comme c'est plus précis, troisièmement, comme l'autre affiche suggéré, essayez de modifier l'ordre d'exécution ou de faire vos courses en isolation (probablement le moyen le plus sûr).

+1

une minute n'a pas besoin de nanotime, je suppose. –

Questions connexes