2011-09-25 18 views
7

Przeczytałem the article about Google's upcoming DASH/DART language, który uznałem za interesujący.W jaki sposób Google Dart może uzyskać lepszą wydajność?

Jedną z rzeczy, na które natknąłem się, jest to, że mówią, że usuwają problemy związane z wydajnością JavaScriptu. Ale jakie dokładnie są te problemy z wydajnością? W tekście nie ma żadnych przykładów. To wszystko mówi:

  • Performance - Dash został zaprojektowany z charakterystyk w umysłu, dzięki czemu możliwe jest tworzenie maszyn wirtualnych, które nie mają problemów z wydajnością że wszystko ECMAScript VM musi mieć.

Czy masz jakieś pomysły na temat problemów związanych z wydajnością?

+1

Benchmarki lub się nie stało. Spekulowanie na temat wykonania czegoś, co nie zostało wydane, jest zupełną bzdurą. – fijal

+0

Zabawne jest to, że Dart wydaje się być ** wolniej ** niż JS. – c69

Odpowiedz

5

Jednym z przykładów jest eliminacja tail call (jestem pewien, że niektórzy uważają, że jest to wymagane w przypadku wysokiej wydajności functional programming). feature request został wprowadzony do Google V8 JavaScript VM, ale to była odpowiedź:

eliminacja połączeń Tail nie jest kompatybilny z JavaScript, który jest wykorzystywany w realnym świata.

+0

Idealne, właśnie tego szukałem! – Sune1987

8

Ten wątek jest lektura obowiązkowa dla wszystkich zainteresowanych w języku dynamicznym tylko w kompilatory czasowych: http://lambda-the-ultimate.org/node/3851

uczestników tego wątku jest twórcą luajit, że pypy ludzie, javascript programiści Mozilli i wiele więcej . Zwróć szczególną uwagę na komentarze Mike'a Pall'a (on jest twórcą luajita) i jego opinie na temat javascript i Pythona w szczególności. Mówi, że projektowanie języka wpływa na wydajność. Przywiązuje wagę do prostoty i ortogonalności, unikając na przykład szalonych przypadków narożnych, które nękają javascript.

Omówiono tam wiele różnych technik i podejść (śledzenie dżetów, jity metod, tłumaczy itp.). Sprawdź to!

Luis

6

W artykule odnosi się do trudności optymalizacyjnych, które pochodzą z niezwykle dynamicznych języków takich jak JavaScript, plus prototypal dziedziczenia.

W językach takich jak Ruby lub JavaScript struktura programu może się zmieniać w czasie wykonywania. Klasy mogą uzyskać nową metodę, funkcje mogą być eval() 'ed do istnienia i więcej. Utrudnia to środowisku wykonawczemu optymalizację kodu, ponieważ struktura nigdy nie jest gwarantowana.

Dziedziczenie prototypowe jest trudniejsze do zoptymalizowania niż bardziej tradycyjne języki oparte na klasach. Podejrzewam, że tak jest, ponieważ istnieje wiele lat doświadczeń w zakresie badań i wdrażania dla maszyn wirtualnych opartych na klasach.

Co ciekawe, V8 (silnik JavaScript Chrome) wykorzystuje ukryte klasy w ramach strategii optymalizacji. Oczywiście JS nie ma klas, więc układ obiektów jest bardziej skomplikowany w V8.

Układ obiektu w V8 wymaga co najmniej 3 słów w nagłówku. W przeciwieństwie do Dart VM wymaga tylko 1 słowo w nagłówku. Rozmiar i struktura obiektu Dart jest znana podczas kompilacji.Jest to bardzo przydatne dla projektantów VM.

Kolejny przykład: w Dart istnieją rzeczywiste listy (inaczej tablice). Możesz mieć listę o stałej długości, która jest łatwiejsza do zoptymalizowania niż tablice JavaScript niezupełnie rzeczywiste i zawsze zmienne długości.

Więcej o kompilacji Dart (i JavaScript) do efektywnego kodu z tej prezentacji: http://www.dartlang.org/slides/2013/04/compiling-dart-to-efficient-machine-code.pdf

wymiar innego świadczenia jest czas rozruchu. Ponieważ aplikacje internetowe stają się bardziej złożone, liczba linii kodu rośnie. Konstrukcja JavaScript utrudnia optymalizację uruchamiania, ponieważ parsowanie i ładowanie kodu również wykonuje kod. W Dart język został starannie opracowany, aby można go było szybko przeanalizować. Dart nie wykonuje kodu podczas ładowania i analizowania plików.

Oznacza to również, że maszyny wirtualne Dart mogą buforować binarną reprezentację przeanalizowanych plików (zwaną migawką), aby jeszcze szybciej uruchomić komputer.

Powiązane problemy