Inspiré de Cette question ,
maintenant visible uniquement pour les utilisateurs avec> 10k Repe SUB> P> J'ai proposé le code suivant: P> $cat loop.c
int main( int argc, char ** argv )
{
int i = 0;
while( i++ < 2147483647 );
}
$cc -o loop loop.c
$ time ./loop
real 0m11.161s
user 0m10.393s
sys 0m0.012s
$cat Loop.java
class Loop {
public static void main( String [] args ) {
int i = 0;
while( i++ < 2147483647 );
}
}
$javac Loop.java
$time java Loop
real 0m4.578s
user 0m3.980s
sys 0m0.048s
9 Réponses :
Il y a des choses que vous devez contrôler ici: p>
"Ce qui me manque ici?" Drapeaux d'optimisation. p>
Je suppose que le JIT optimise la boucle vide. P>
mise à jour: l'article de syntonisation de performance Java Suivi de la benchmark de boucle vide semble supporter Cela, ainsi que les autres réponses, indiquez que le code C doit également être optimisé afin de faire une comparaison significative. Citation clé: p>
Si j'ai choisi d'utiliser le mode client 1.4.1 JVM (le client est le mode par défaut), les boucles ne seraient pas optimisées. Si j'ai choisi d'utiliser le compilateur C ++ de Microsoft, la version C ne prendrait pas de temps. Clairement, le choix du compilateur est critique. p> blockQuote>
Je ne pense pas que cette question a vraiment une réponse; Cela dépend des optimisations des deux compilateurs. Dans ce cas, je m'attends non plus, si c'était piquer en suffisamment d'effort d'optimisation, éliminerait la boucle entièrement que i code> n'est jamais utilisé. P>
Optimisation - Vous manquez au moins le drapeau -O2 code> sur la ligne de commande gcc code>. p>
Je m'attends à code> Javac code> est en défaut à un niveau d'optimisation plus élevé que votre compilateur C. Lorsque je compile avec C avec -O3 code> ici, le C est bien plus rapide: -O3 code>: p> public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: iinc 1, 1
6: ldc #2; //int 2147483647
8: if_icmpge 14
11: goto 2
14: return
}
Votre compilateur a probablement optimisé la boucle claire hors de l'existence. Vérifiez le code de montage généré.
Je m'attendrais alors, oui. Je suis sûr que le Java fait la même chose, le temps impliqué est le démarrage JVM. Si je colle un volatile code> dans le programme C, il retourne lentement; Je ne sais pas comment faire la même chose en Java.
Bien meilleur. J'ai vu ce drapeau mais je pensais que c'était "zéro trois" et je ne pouvais pas l'appliquer. Jusqu'à ce que j'ai vu cette réponse, je me rends compte que c'était "Ouh trois" nouvelle fois: "Real: 0m0.001s, utilisateur: 0m0.000s, Sys: 0m0.000s"
@ Tur1ng, j'ai essayé cela, cela me donne une erreur de compilation. Je ne connais pas Java d'un trou dans le sol, j'ai peur.
@Oscar, l'une des meilleures choses que vous puissiez faire pour améliorer votre vie de programmation est de trouver une police à largeur fixe qui facilite la différence entre O code> et 0 code> , et entre 1 code>, l code> et i code>.
@CARL NORUM: Le désassembleur Java est Javap, alors exécutez la boucle Javap -C. Java ne supprime pas le code lors de la compilation, mais l'optimise probablement avec JIT.
@DAHMANN: Pas vraiment, c'est assez lent, l'optimiseur CC est celui qui me fait un bon travail ici. @Carl. Eh bien, je suppose que cette fois ce n'était pas la police mais Pebkac img196.imageshack.us/img196 /2310/screenshot3xo.png
@Piligrim, Yup, c'est comme ça qu'il apparaît.
On dirait que (comme Dehmann pointe) l'option -Server code> fonctionne beaucoup mieux.
@Oscar Reyes, je ne vois aucune différence avec ou sans dénoncer. Il donne des performances Stimuler uniquement pour les applications à long terme.
@Piligrim: J'ai mis à jour la question avec la performance obtenue en utilisant le drapeau -Server. Je ne sais pas comment ça marche mais je suppose que cela utilise un algorithme différent pour optimiser cela.
@Oscar Reyes, -Server fait de la JIT pour compiler tout le code, pas seulement des points chauds. Sur ma machine, le temps est de 0,165 dans les deux cas.
Le compilateur Java Jit est suffisamment intelligent pour optimiser la boucle, tandis que votre compilateur C semble avoir la plupart des optimisations désactivées. p>
Vous comparez donc vraiment l'heure de démarrage de la machine Java avec le temps qu'il faut un code C non optimisé pour compter sur 2 milliards. p>
Votre programme ne fait absolument rien de sorte que cela ne dit rien sur la performance des deux langues. La seule chose qu'il vous dit, c'est si votre compilateur est capable de comprendre cela et de sauter complètement votre programme. P>
Pour faire "quelque chose", vous devriez imprimer chaque incrément à stdout. Si vous imprimez uniquement le résultat final, un bon compilateur pourrait optimiser votre programme à une instruction imprime simplement ce résultat et saute tout le "calcul". P>
Au moins, cela me dit combien de temps faudrait-il pour sauter le tout (et s'il peut le sauter dans la place du poing. Pour C, prendriez 3 ms pour Java 200ms et la réponse est que les deux peuvent sauter.
Si vous essayez de faire un compilateur faire une certaine unité ou, eh bien, référence em> de travail, alors vous devez le tromper en pensant que le résultat du travail sera réellement utilisé. p>
Un moyen de faire cela consiste à écrire une fonction dans un fichier, compilez-la, puis appelez-la avec la configuration d'un autre fichier. Aucun compilateur ne peut anticiper ce qui sera compilé à l'avenir. P>
Sans cela, il s'agit simplement d'un concours entre les niveaux d'optimisation par défaut et n'a aucune signification utile. p>
Vous devez également exécuter Java avec l'option
-Server code> pour le rendre plus rapide. Et bien sûr, comme d'autres personnes ont souligné, utilisez l'option-O3 code> dans la commandecc code>.Juste pour l'enregistrement, j'ai vu le drapeau d'optimisation pour C, mais je pensais que c'était "03" quand il devrait vraiment être "O3";)
@Dehmann OMG avec -server Java passe de 4s à 7ms: -O: -O: -O
Puis-je avoir vos paramètres / thème Ubuntu?
@Baddie: Bien sûr .. erhmm ... Comment puis-je vous dire ça?
@Baddie & @oscar ... Dito sur le thème, c'est vraiment sympa.
@Mark: Je ne me souviens pas d'avoir réglé un thème. Je pense que je viens de mettre un arrière-plan que j'ai aimé, faites glisser la barre d'outils vers la gauche et la personnalisez-la à l'air translucide .. mmmhh quoi d'autre ... je vais Vérifiez-le et laissez-vous savoir.
@Oscar & @baddie La base de thème Votre utilisation est appelée la poussière, c'est une installation par défaut à Ubuntu. Il semble que vous ayez modifié la décoration de texte par défaut sur la barre de menus de gras à la normale. Et oui, la barre de menus est maintenant à gauche.