Dla funkcji takich jak to:
function threeArgs(x, y, z) {
return x + y + z;
}
że nazywa się tak:
threeArgs(1, 2, 3);
optymalizator może swobodnie dokonać wyboru, do generowania kodu w ogóle nie ma. Dość łatwo jest stwierdzić, że nie ma żadnych skutków ubocznych, ponieważ funkcja po prostu odwołuje się do wartości parametrów i zwraca wynik prostego wyrażenia. Ponieważ zwracana wartość jest ignorowana, nie ma powodu, aby środowisko wykonawcze cokolwiek robiło.
poza tym, jeśli kod był:
something += threeArgs(1, 2, 3);
optymalizator może zdecydować, aby wygenerować kod grubsza odpowiada:
something += 6;
Dlaczego? Ponieważ wywołanie zostało wykonane z liczbowych stałych i może bezpiecznie spasować je w czasie generowania kodu. Może to być konserwatywne, ponieważ liczby są dziwne, ale tutaj wszystkie są liczbami całkowitymi, więc może to zrobić. Nawet jeśli nie, to może bezpiecznie inline funkcję:
something += 1 + 2 + 3;
Kiedy pojawia się parametr brakuje, jednak może się okazać, że optymalizujące wyskoczyć i generują prawdziwe wywołanie funkcji. W przypadku takiej prostej funkcji obciążenie związane z wywołaniem funkcji może łatwo uwzględniać dużą różnicę w wydajności.
Używając zmiennych zamiast stałych w teście, i faktycznie używając zwracanej wartości funkcji, można "pomylić" optymalizator i powstrzymać go od pominięcia połączenia lub wstępnego obliczenia wyniku, ale można " t nie umieszczaj go w pozycji inline. Nadal uważam, że twój wynik jest interesujący z tego powodu: ujawnia to, że (od dzisiaj) ci optymiści są wrażliwi na sposób wywoływania funkcji.
@MattWhipple - To interesujący post, ale co to ma wspólnego z pytaniem OP? (Dobre pytanie, przy okazji, @robC.) –
To interesujące znalezisko.Zanim zmienisz cały kod, aby wypełnić wszystkie argumenty, sprawdziłbym, czy istnieje otwarty raport o błędzie dla tych implementacji JS, a jeśli nie, to go. –
Zdecydowanie podejrzewam, że środowisko wykonawcze ustawia funkcje, gdy jest dopasowany parametr licznika, ale działa funkcja jako faktyczne wywołanie funkcji w inny sposób. Fakt, że nic nie wykorzystuje żadnej wartości zwracanej przez funkcję, może oznaczać, że środowisko wykonawcze * nie robi nic * po pełnym wprowadzeniu parametrów. – Pointy