Mam implementację executora wątków, w której koszt opakowania jest bardzo kosztowny. Istnieje zadanie klasy opakowującej, które jest zdefiniowane w następujący sposób:Dlaczego wywołanie metody Java jest tak kosztowne?
class Task {
public Runnable r;
public Task(Runnable r) {
this.r = r;
}
public void run() {
r.run();
}
List<task> taskList;
W następującym przypadku czas działania wynosi ~ 800ms.
for (Task t : taskList) {
t.r.run();
}
Dla następującego przypadku jest to ~ 7000ms.
for (Task t : taskList) {
t.run();
}
Nie dzieje się to w izolacji, ale dzieje się wewnątrz kodu executora. Zastanawiasz się, czy ktoś ma podpowiedź, co się dzieje?
uruchamialny przepuszcza się następująco tego testu:
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;
}
Dla porównania, kod znajduje się na github.com/sharvanath/TempThreadPool. Uruchom test ThreadPoolTest, aby uzyskać wynik wykonania. Teraz spróbuj zmienić linię 41 ThreadPool.java i zobacz magię.
Co robi 'run'? Czy to nie jest operacja? – 5gon12eder
Powinna istnieć (prawie zerowa) różnica dla kodu, który tu zamieściłeś. Musi być coś w innym kodzie. –
Nie należy udostępniać całego kodu - należy dołączyć * minimalny * przykład demonstrujący problem. –