Java vs C # Multithreading-Leistung, warum wird Java langsamer? (Grafiken und vollständiger Code enthalten)

9

Ich habe kürzlich Benchmarks für Java und C # für 1000 Aufgaben ausgeführt, die über einen Threadpool geplant werden. Der Server verfügt über 4 physische Prozessoren mit jeweils 8 Kernen. Das Betriebssystem ist Server 2008, hat 32 GB Arbeitsspeicher und jede CPU ist ein Xeon x7550 Westmere / Nehalem-C.

Kurz gesagt, die Java-Implementierung ist viel schneller als C # bei 4 Threads, aber viel langsamer, wenn die Anzahl der Threads zunimmt. Es scheint auch, dass C # pro Iteration schneller geworden ist, wenn die Anzahl der Threads gestiegen ist. Diagramme sind in diesem Beitrag enthalten:

Die Java-Implementierung wurde auf einer 64-Bit-Hotspot-JVM geschrieben, mit Java 7 und einem Executor-Service-Threadpool, den ich online gefunden habe (siehe unten). Ich habe auch die JVM auf gleichzeitige GC gesetzt.

C # wurde auf .net 3.5 geschrieben und der Threadpool kam aus Codeprojekt: Ссылка

(Ich habe den folgenden Code eingefügt).

Meine Fragen:

1) Warum wird Java langsamer, aber C # wird schneller?

2) Warum schwanken die Ausführungszeiten von C # stark? (Dies ist unsere Hauptfrage)

Wir haben uns gefragt, ob die C # -Fluktuation dadurch verursacht wurde, dass der Speicherbus ausgelastet war ...

Code (Bitte markieren Sie keine Fehler beim Sperren, dies ist für meine Ziele irrelevant):

Java

%Vor%

C #:

%Vor%     
mezamorphic 05.04.2012, 11:32
quelle

1 Antwort

5

Sie scheinen die Threading-Frame-Arbeit nicht so oft zu testen, wie Sie testen, wie die Sprache unoptimierten Code optimiert.

Java ist besonders gut darin, sinnlosen Code zu optimieren, was meiner Meinung nach den Unterschied in den Sprachen erklären würde. Wenn die Anzahl der Threads zunimmt, vermute ich, dass sich der Flaschenhals auf die Art und Weise, wie der GC vorgeht, oder auf andere Dinge, die für Ihren Test von Belang sind, bewegt.

Java könnte auch langsamer werden, da NUMA standardmäßig nicht aktiviert ist. Versuchen Sie, -XX:+UseNUMA auszuführen. Ich schlage jedoch vor, dass Sie für maximale Leistung versuchen, jeden Prozess in einer einzelnen numaregion zu halten, um den cross numa Overhead zu vermeiden.

Sie können auch versuchen, diesen Code etwas zu optimieren, der auf meinem Rechner 40% schnell war

%Vor%     
Peter Lawrey 05.04.2012 11:55
quelle

Tags und Links