Mise à JOUR 2:
Modification de la cible de x86 à anycpu a abaissé la moyenne des temps d'exécution à 84ms par run, en baisse à partir de 282ms. Je devrais peut-être de diviser cette de dans un deuxième thread?
Mise à JOUR:
Grâce à Femaref ci-dessous qui a souligné certains problèmes de tests, et en effet, après avoir suivi ses conseils, les temps sont plus faibles, indiquant que la VM moment de l'installation a été importante en Java, mais probablement pas en C#. En C#, il a été les symboles de débogage qui ont été importantes.
J'ai mis à jour mon code pour l'exécution de chaque boucle de 10 000 fois, et la seule sortie de la moyenne de la ms à la fin. Le seul changement que j'ai fait a été de la version C# où je suis passé à l' Chronomètre classe pour une résolution plus grande. J'ai collé avec millisecondes, car il est assez bon.
Résultats:
Les tests ne sont pas expliquer pourquoi Java est (encore) beaucoup plus rapide que celle de C#. C# performance a été meilleure, mais ce peut être entièrement expliquée en supprimant les symboles de débogage. Si vous lisez Mike Deux et j'ai du échanger sur les commentaires attachés à cette OP, vous verrez que j'ai ~280ms moyenne dans cinq séries du code C#, simplement en changeant de Débogage pour publication.
Numéros:
- 10 000 le comte de la boucle de la non modifié code Java m'a donné une moyenne de 45ms (en bas de 55ms)
- 10 000 le comte de la boucle de code C# en utilisant le Chronomètre de classe m'a donné une moyenne de 282ms (en bas de 320ms)
Tout cela laisse la différence inexpliquée. En effet, le différentiel de pire. Java est passé de ~5,8 x plus rapide à ~6.2 x plus vite.
(Original post ci-dessous)
J'ai quelques solutions différentes pour Projet Euler problème 5, mais le temps d'exécution de la différence entre les deux langues/plates-formes dans cette mise en oeuvre particulière m'intrigue. Je ne fais pas de l'optimisation avec les drapeaux de compilation, tout simplement javac
(via la ligne de commande) et csc
(via Visual Studio).
Voici le code Java. Il se termine en 55ms.
public class Problem005b { public static void main(String[] args) { long begin = Système.currentTimeMillis(); int i = 20; while (true) { si ( (i % 19 == 0) && (i % 18 == 0) && (i % 17 == 0) && (i % 16 == 0) && (i % 15 == 0) && (i % 14 == 0) && (i % 13 == 0) && (i % 12 == 0) && (i % 11 == 0) ) { break; } i += 20; } long fin = Système.currentTimeMillis(); Système.out.println(i); Système.out.println(fin-début du " + "ms"); } }
Voici l'identique de code C#. Il se termine en 320ms
en utilisant le Système; espace de noms ProjectEuler05 { classe Problem005 { static void main(String[] args) { DateTime commencer = DateTime.Maintenant; int i = 20; while (true) { si ( (i % 19 == 0) && (i % 18 == 0) && (i % 17 == 0) && (i % 16 == 0) && (i % 15 == 0) && (i % 14 == 0) && (i % 13 == 0) && (i % 12 == 0) && (i % 11 == 0) ) { break; } i += 20; } DateTime fin = DateTime.Maintenant; Laps de temps écoulé = en fin de commencer; Console.WriteLine(i); Console.WriteLine(écoulé.TotalMilliseconds + "ms"); } } }