Ich habe eine Thread-Executor-Implementierung, wo die Kosten für einen Wrapper als sehr teuer angezeigt werden. Es gibt eine Wrapper-Klasse Aufgabe, die wie folgt definiert ist:Warum ist der Java-Methodenaufruf hier so teuer?
class Task {
public Runnable r;
public Task(Runnable r) {
this.r = r;
}
public void run() {
r.run();
}
List<task> taskList;
Für Fall im Anschluss an die Laufzeit ist ~ 800ms.
for (Task t : taskList) {
t.r.run();
}
Während für den folgenden Fall ist ~ 7000ms.
for (Task t : taskList) {
t.run();
}
Es passiert nicht isoliert, aber geschieht innerhalb des Codes des Executors. Ich frage mich nur, ob jemand einen Hinweis darauf hat, was passieren könnte?
Der runnable folgend für diesen Testfall übergeben wird:
class Tester implements Runnable {
int i;
public Tester(int i) {
this.i = i;
}
@Override
public void run() {
//System.out.println(i);
for (int j = 0; j < 1000000; j++) {
i = j;
}
}
public int getI() {
return i;
}
Als Referenz kann der Code auf github.com/sharvanath/TempThreadPool finden. Führen Sie den ThreadPoolTest aus, um das Ergebnis der Ausführung abzurufen. Versuchen Sie nun Zeile 41 von ThreadPool.java zu ändern und sehen Sie sich die Magie an.
Was macht 'run'? Ist es ein No-Op? – 5gon12eder
Es sollte (fast Null) Unterschied für den Code geben, den Sie hier gepostet haben. Es muss etwas in anderem Code sein. –
Sie sollten nicht den gesamten Code teilen - Sie sollten ein * minimum * Beispiel einschließen, das das Problem demonstriert. –