2011-12-25 22 views
5

Pytanie w języku JavaScript - które z poniższych jest najlepsze w praktyce i jest przyjazne dla wydajności, również mile widziane są wszelkie inne sugestie. To jest najprostsza wersja oryginalnego projektu. Będzie ponad 20 zmiennych i ponad 10 wewnętrznych funkcji (np. "Proces" w przypadku).Javascript - Argumenty Vs Funkcje zagnieżdżone Vs Wydajność

Zaletą metody 1 jest to, że nie musi wysyłać argumentów do funkcji, ale ponieważ łączy wszystkie funkcje wewnątrz głównej funkcji (ewentualnie regeneruje całą wewnętrzną funkcję dla każdego wystąpienia Foo). Chociaż metoda 2 jest wolna od zagnieżdżania funkcji, ale wymaga wielu argumentów. Zauważ, że będzie także wiele instancji konstruktora Foo.

Metoda 1:

function Foo() { 
    var a = 1; 
    var b = 2; 
    var c = (a+b)/2; 
    var $element = $('#myElement'); 

    var process = function(){ 
     var x = a+b+c; 
     $element.css('left', x) 
     return x; 
    } 
    x = process(); 
} 

Metoda 2:

function Foo() { 
    var a = 1; 
    var b = 2; 
    var c = (a+b)/2; 
    var $element = $('#myElement'); 
    x = process (a, b, c, $element); 
} 

function process (a, b, c, $element){ 
    $element.css('left', x) 
    return x; 
} 

Odpowiedz

4

Rozdzielone funkcje są zdecydowanie droga do wydajności. Chociaż istnieją sytuacje, w których dobrze byłoby mieć zmienne zakresowanie funkcji zagnieżdżonych, trafienie wydajności może być ogromne, jeśli funkcja jest duża.

Należy pamiętać, że za każdym razem, gdy wywoływany jest Foo, proces var polega na ponownym przydzielaniu całej pamięci dla tworzonej nowej funkcji, a nie zachowywaniu funkcji w pamięci i przekazywaniu jej nowych parametrów. Jeśli funkcja jest duża, będzie to dość intensywne zadanie dla tłumacza Javascript.

Oto niektóre twarde liczby, które mogą pomóc, jak również (Zawiera porównań wydajności i rzeczywistych punktów odniesienia, które można uruchomić w swojej przeglądarki): http://jsperf.com/nested-functions-speed, http://jsperf.com/nested-named-functions/5

+0

Tak, funkcje rozdzielone mają lepszą wydajność nawet przy większej liczbie argumentów. Dziękuję za odpowiedź. – user1106995

2

Właściwie przeglądarek nie optymalizują nawet zagnieżdżone funkcje w którym porównano różnice w wynikach funkcje zadeklarowane w zewnętrznym zakresie stają się nieistotne.

Napisałem na blogu my findings i utworzyłem performance test, aby wspomóc to roszczenie.

EDYCJA: Test został złamany, after fixing test pokazuje, że nadal jest szybciej nie zagnieżdżać funkcji.

+0

Hmm ... są nieco gorsze, ale uważam to za słaby punkt przeglądarek. O wiele lepiej napisać zagnieżdżony kod! Kocham to! Życzę wszystkim obsługiwanym językom i zoptymalizowanym do tego celu, gdy używane są zmienne inne niż lokalne. – momomo