2015-02-17 6 views
5

Niedawno odziedziczyłem bibliotekę, istnieje metoda aktualizacji, która istnieje w klasie. Oto przykład.Optymalizacja Micro, czy jest ona zoptymalizowana w każdym razie przez nowoczesne przeglądarki?

onPointerMove(pointer, x, y, isPressed){ 
    var floor = Math.floor; 
    var cx = this.currentX; 
    var cy = this.currentY; 
    var tm = this.toolManager; 
} 

Ten rodzaj kodu występuje głównie w materiałach o krytycznym znaczeniu dla wydajności. Większość pozostałych projektów nie została napisana w ten sposób.

  1. Podłoga jest używana dwukrotnie. Z pewnością buforowanie go w zmiennej lokalnej po prostu wymusza jakiś "tymczasowy" przydział pamięci za każdym razem, gdy jest uruchamiany? Jak to jest szybsze niż po prostu szukanie funkcji?
  2. This.currentX odwołuje się wiele razy podczas całego ciała funkcji, ale buforuje to naprawdę szybciej? Pomyślałbym, że this.currentX nie powoduje problemów z wyszukiwaniem, ale może się mylę. Ponieważ dzieje się to z pozostałym kodem w przykładzie, wszystkie te właściwości są buforowane.

Czy to nie ma większego znaczenia w nowoczesnych silnikach JavaScript? Zakładam, że optymalizacje takie jak ta, jeśli są one szybsze .... Będą brane jako dane do optymalizacji w każdym razie wewnątrz V8. Na przykład, jeśli Math.round został wywołany 20 razy w funkcji, to czy silnik i tak by go zapisał?

Spodziewałbym się również takich rzeczy jak buforowanie o wiele, zanim "dla niego" jest również kolejnym przykładem tego, co do którego zakładam, że zoptymalizowane silniki do wykonania w każdym razie podczas interpretacji kodu (ponownie, tylko JEŚLI to nawet robi różnicę).

Wszystko, co naprawdę chcę wiedzieć, to ... od tego dnia, czy powinienem robić te mikrooptymalizacje (dla przeglądarek zimozielonych) i optymalizować mój kod, czy też trochę się przesunąć od 2010 roku (kiedy czytam Wydajność JavaScript)

Dzięki!

+1

Nie optymalizuj (szczególnie: poświęć czytelność/łatwość konserwacji), chyba że masz problem i użyłeś profilera, aby znaleźć wąskie gardło/problem. Przy okazji: możesz odpowiedzieć na większość, jeśli nie wszystkie, pytań w twoim poście, jeśli po prostu użyłeś profilera (lub innego sposobu pomiaru). Po prostu zbuduj testówkę i profiluj/mierz. Proste. Chciałbym wskazać [jsperf.com] (http://jsperf.com/), ale obecnie nie działa. – RobIII

+0

Dzięki za wskazanie profilowania RobIII! Dodałem go do mojej listy rzeczy do zrobienia, która lepiej ją przetwarza. – Clark

Odpowiedz

3

Nie optymalizuj przedwcześnie. O ile niektóre profile nie pokazują, że te rzeczy w kodzie rzeczywiście powodują wąskie gardło lub nieproporcjonalne zużycie zasobów, nie przejmuj się optymalizacją ich pod względem teorii wydajności.

Jeśli chodzi o rzeczywistą wydajność: wyszukiwania atrybutów obiektów (takie jak Math.floor lub this.currentX) są operacjami o (1), ponieważ są one efektywnymi sprawdzianami hashmap. Zapisanie ich w zmiennej jako takiej wydaje się bardziej poprawą czytelności niż cokolwiek innego.