Wenn ich das Generieren von Debug-Informationen mit Javac einschalte, dann sind die Klassendateien 20-25% größer. Hat dies Auswirkungen auf die Ausführung des Java-Programms? Wenn ja, unter welchen Bedingungen und wie viele. Ich erwarte einen kleinen Einfluss auf das Laden der Klassen, da die Dateien größer sind, aber dies sollte minimal sein.Gibt es einen Leistungsunterschied zwischen Javac debug ein und aus?
Antwort
In jeder Sprache sind Debuginformationen Metainformationen. Es erhöht naturgemäß die Größe der Objektdateien und erhöht somit die Ladezeit. Bei der Ausführung außerhalb eines Debuggers wird diese Information tatsächlich vollständig ignoriert. Wie beschrieben (obwohl nicht klar) in der JVM spec wird die Debug-Information außerhalb des Bytecode-Stroms gespeichert. Dies bedeutet, dass zur Ausführungszeit kein Unterschied in der Klassendatei besteht. Wenn Sie jedoch sicher sein wollen, probieren Sie es aus :-).
Ps. Oftmals gibt es zum Debuggen einen Wert beim Ausschalten der Optimierung. Das hat einen Leistungseinfluss.
Das Debugging sollte keinen Unterschied machen. Aber sobald Sie das Debuggen ausschalten und die Optimierung einschalten, sollten Sie einen Unterschied sehen, da dies einige statische Optimierungen zur Kompilierzeit bewirkt. Auf diese Weise wird sogar Ihr Hot-Spot-optimierter Code zur Laufzeit schneller.
Aber bis jetzt, die Abwägung zwischen der Bedeutung von vollen Stack-Spuren oder etwas mehr Benutzer-Performance, habe ich immer für die Stack-Spuren gewählt. Schließlich sind Benutzer bereit, 1000 $ pro Jahr auszugeben, um eine schnellere Maschine zu bekommen, aber sind nicht bereit, 15 Minuten damit zu verbringen, Ihnen bedeutungsvolle Fehlermeldungen zu geben, um ihre Probleme zu lösen.
Nach den Jahren bin ich eher bereit, meine 15 Minuten höher als die 1000 $ des Benutzers zu bewerten. :)
Bitte beachten Sie, dass seit JDK1.3 Javac alle Optimierungs-Flags ignoriert „Compiler-Optimierung nicht notwendig ist“
Anmerkung: http://ant.apache.org/manual/Tasks/javac.html –
Hat Javac noch -O? Zuletzt erinnere ich mich daran, es war das Äquivalent von -g: keiner. –
Korrigieren. Die Ladezeit ist betroffen, die Ausführungszeit jedoch nicht. – kohlerm
Tatsächlich hat der Sun Java Compiler kein Optimierungs-Flag. Die Optimierung findet hauptsächlich in der Hotspot-Laufzeit statt. Die Optimierung zur Kompilierungszeit kann die Optimierung von Hotspots beeinträchtigen (unter Verwendung vollständiger Informationen, die nur zur Kompilierungszeit verfügbar sind). –