Warum ist der Java-Methodenaufruf hier so teuer? [geschlossen]

8

Ich habe eine Thread-Executor-Implementierung, bei der sich die Kosten eines Wrappers als sehr kostspielig erweisen. Es gibt eine Wrapper-Klasse Task, die wie folgt definiert ist:

%Vor%

Für den folgenden Fall beträgt die Laufzeit ~ 800ms.

%Vor%

Während es für den folgenden Fall ~ 7000ms ist.

%Vor%

Es geschieht nicht isoliert, sondern im Code des Executors. Ich frage mich nur, ob jemand einen Hinweis hat, was passieren könnte?

Für diesen Testfall wird folgende runnable ausgeführt:

%Vor%

Als Referenz finden Sie den Code auf github.com/sharvanath/TempThreadPool . Führen Sie den ThreadPoolTest aus, um das Ergebnis der Ausführung abzurufen. Jetzt ändern Sie Zeile 41 von ThreadPool.java und sehen Sie die Magie.

    
Sharvanath 15.02.2016, 09:16
quelle

1 Antwort

1

Bitte beachten Sie, dass Sie beim mikromanaging in Java einige Tricks anwenden müssen, da jvm den Code beim Fliegen mit dem JIT-Compiler optimieren und viele Tricks ausführen kann, von denen Sie nichts wissen, und sieht so aus, als ob Ihre Tests tatsächlich nicht funktionieren Tue alle notwendigen Dinge, damit JVM diesen Job für dich erledigen kann (du musst dich vor dem Test aufwärmen, in Verkleidungen entkommen, toten Code und so weiter.)

Es ist ein guter Anfang, dieses Thema zu lesen - Wie schreibe ich einen korrekten Mikro-Benchmark in Java?

Ich rate Ihnen auch, das JMH-Framework für Ihre Tests zu verwenden, die bereits viele Beispiele für ihre Verwendung im Quellcode enthalten.

    
TheHckblues 15.02.2016 10:34
quelle

Tags und Links