Ich bin dabei, einen bestimmten Datenverarbeitungsalgorithmus von Java nach C ++ zu portieren. Der Grund für das Umschreiben des Codes ist die Portabilität. Er muss in Umgebungen ausgeführt werden, in denen Java nicht verfügbar ist. Als Nebeneffekt wurde jedoch eine Leistungsverbesserung erwartet.
Grundsätzlich liest der Algorithmus Daten aus einem Graphen, der aus Objekten mit Zeigern besteht, und berechnet dann ein Ergebnis. Während der Berechnung werden zahlreiche Objektzuordnungen vorgenommen, was möglicherweise für die Verlangsamung verantwortlich ist. Die Sache ist, der C ++ - Code läuft derzeit etwa 10-mal schneller als der alte Java-Code. Das war wirklich unerwartet. Ich dachte nur, ich würde eine Verbesserung von vielleicht 50-60% sehen.
Leider kann ich den Code hier nicht zur Analyse posten. Es sind mehrere tausend Zeilen, also bin ich mir nicht sicher, wie bequem das sowieso wäre.
Die Sache ist, der Algorithmus ist fast genau derselbe. Der einzige große Unterschied, den ich mir vorstellen kann, ist, dass es in Java viele Tochterklassen einer einzelnen Superklasse gibt und if (object.getClass () == daughterx.class) oft während der Berechnung aufgerufen wird, während im C ++ Code nur ein allgemeiner Code verwendet wird Klasse wird verwendet (da es wenige Codedifferenzen zwischen den Tochterklassen gibt) und ein einfacher Ganzzahlvergleich wird verwendet, z. if (object- & gt; type == 15)
Wie teuer ist die Methode Object.getClass () in Java? Was passiert genau auf der Low-Ebene, wenn diese Methode aufgerufen wird?
Der wahrscheinlichste Fall für einen 10-fachen Unterschied ist, dass die JVM nicht vollständig aufgewärmt wurde. Wenn Sie dies nicht tun, können Sie sogar in Java einen Leistungsunterschied von mehr als 10x sehen. Ich würde versuchen, in Chargen von 10.000 zu laufen und die ersten paar Läufe zu ignorieren.
%Vor%druckt
%Vor%Vom ersten bis zum letzten Lauf hat sich die Leistung um den Faktor 3000x verbessert
Wie teuer ist die Methode Object.getClass () in Java?
Basierend auf meinem Wissen darüber, wie es in Nicht-Mainstream-JVMs implementiert wird, ist es billig
Was genau passiert auf der unteren Ebene, wenn diese Methode aufgerufen wird?
Typisch ...
Class
aus dem Klassendeskriptor (2 oder 3 Anweisungen) Die Sache ist, der C ++ - Code läuft derzeit etwa 10-mal schneller als der alte Java-Code.
Ich gehe davon aus, dass der Performance-Engpass anderswo ist. Sie sollten versuchen, den Java-Code zu profilieren, bevor Sie zu irgendwelchen Schlussfolgerungen übergehen, warum es langsamer war.
Es ist wahrscheinlich nicht der einzige Faktor für den Leistungsunterschied. Leider, ohne ein viel vollständigeres Bild dessen, was dein Code tatsächlich macht, wird es wirklich schwer sein, dir zu sagen, was vor sich geht.
Nach meiner Erfahrung gibt es keinen Grund, warum Java zehnmal langsamer als C ++ sein sollte. Ich würde wahrscheinlich mit einem Profiler anfangen und sehen, wo es hindeutet, um das Problem zu verstehen, anstatt zu raten.
Tags und Links java