Kann JIT daran gehindert werden, Methodenaufrufe zu optimieren?
Wir bauen ein Tool für die durchschnittliche Laufzeitanalyse von Java-Bytecode-Programmen. Ein Teil davon ist die Messung der tatsächlichen Laufzeiten. Wir würden also eine willkürliche, vom Benutzer bereitgestellte Methode verwenden, die möglicherweise ein Ergebnis hat oder nicht und möglicherweise Nebenwirkungen hat (Beispiele sind Quicksort, Fakultät, verschachtelte Dummy-Schleifen, ...) und sie ausführen (mithilfe von Reflexion), messen die verstrichene Zeit. (Ob wir überhaupt ein Benchmarking durchführen oder nicht, spielt hier keine Rolle.)
Im Benchmarking-Code machen wir offensichtlich nichts mit dem Ergebnis (und einige Methoden haben nicht einmal Ergebnisse). Daher ist nicht abzusehen, was die GEG tun kann, und wir haben tatsächlich festgestellt, dass sie gelegentlich den gesamten Aufruf der Benchmark-Methode zu optimieren scheint. Da die Benchmarking-Methoden in der Realität nicht isoliert angewendet werden, wird der Benchmark unbrauchbar.
Wie können wir JIT daran hindern, dies zu tun? Wir wollen es nicht komplett ausschalten, weil das Benchmarking dann ewig dauert und wir wollen sowieso "echte" Laufzeiten vergleichen (also wollen wir, dass JIT aktiv istInnerhalb die Methode).
Ich bin mir bewusst, dassdiese Frage aber das gegebene Szenario ist zu eng; Wir kennen den Ergebnistyp (falls vorhanden) nicht und können das Ergebnis daher nicht auf eine Weise verwenden, die das JIT nicht als nutzlos ansieht.