2015-09-19 13 views
7

ten kod:Dlaczego ten kod zachowuje się różni w różnych wartościach

var i = 10000000000; 
do { 
    i--; 
} 
while (i !== 0); 
//Result: 38 second. 

var i = 10000000000; 
do {} 
while (i-- !== 0); 
//Result: 27 second. 
//(same result with while (i--) 

var i = 10000000000; 
do {} 
while (i-- | 0); 
//Result: 13.5 second. 

Pytanie brzmi: dlaczego te wersja uzyskać ten sam czas dla mniejszych wartości I? Gdybym wyciął jedno zero od i; wszystkie wersje wymagają 2,2 sekundy. (testowane nawet po optymalizacji JIT - tylko w wersji V8)

Wydaje się logiczne, że trzecia wersja powinna być zawsze szybsza, ale jest szybsza tylko dla bardzo wysokich wartości.

To tylko ciekawość ... nie jest tak naprawdę ważna.

+0

Próbowałem umieścić je w jsperf, ale ma to tendencję do zawieszania się w moich przeglądarkach http://jsperf.com/do-while-speed-test. Należy pamiętać, że różne silniki javascript będą skutkowały różnymi rezultatami, ponieważ priorytetowo traktują różne rzeczy. Może sprowadzać się do czegoś tak prostego, jak sposób obsługi liczb przez system operacyjny. (AKTUALIZACJA: testy zostały uruchomione, ale JSperf rzuca błąd o braku swojej własnej własności 'name' .Nie ma pojęcia, dlaczego tak się stało) – somethinghere

+4

Ostatni jest najszybszy, ponieważ tylko iteruje 1410065408 razy i jest faktycznie 1/3 szybkości drugiego wersja, tj. 104449290 na sekundę vs 370370370 na sekundę –

+0

Dobra obserwacja. Nie zauważyłem tego. –

Odpowiedz

0

Procesor, system operacyjny i interpreter mogą zakłócać szybkość programu w sposób trudny do przewidzenia. Dlatego duża notacja służy do oceny algorytmów.

Jednym z powodów, dla których prędkość może być inna, jest to, że przy jednym mniejszym zera twoja wartość i może być wyrażona tylko 32 bitami. Tak więc kod zespołu generowany przez interpreter może wykonywać optymalizacje i korzystać z instrukcji 32-bitowych liczb całkowitych.

Również wartość i w ostatnim kodzie jest konwertowana na 32-bitową liczbę całkowitą zmieniającą liczbę iteracji, i dlatego działa szybciej, gdy wartość i nie może być wyrażona przy użyciu tylko 32 bitów.

Powiązane problemy