Milyen böngészők nem a javascript kódot Optimization js-motorok példaként v8

Kód optimalizálása kezdődik, nem annyira a tanulmány jellemzője a programozási nyelv, de a megértése a rendszer az egész „folyamat lánc”, amely részt vesz létre egy alkalmazást - a program algoritmus a fordító.

Jelenleg Vjacseszlav aktívan dolgozik a Google-on keresztül Dart VM.
Ebben az interjúban beszélt arról, hogy mi történik a motor belsejében, amely elvégzi a dinamikus JS-kódot és a közös példa, hogyan kell elvégezni néhány optimalizálási és miért fontos, hogy alaposan megértsék a munka a motor lehetővé teszi a gyors futtatását.

- Fokozatos mekhmat NSU. Mindig érdekelt a fordító. Eleinte dolgozott Excelsior Novoszibirszk, ahol az emberek a saját JVM az AOT-fordító, aztán elmentem a Google. A Google az első részt a V8, akkor a Dart VM, egy ideig még a javítást különböző bogarak és LuaJIT.

- Sokan inkább a V8 autó képes optimalizálni kódot. Mi a titka?

- A fő nehézség az optimalizálás dinamikus programozási nyelvek, hogy annak érdekében, hogy maximális teljesítményt, a virtuális gép kell, sőt, kitalálni a szándék a programozó, és látni a statikus szerkezet, rejtett dinamikus kódot. Egy erős jellemzője a V8 hogy képes elég jól észre, hogy a szerkezetét.

és kiderül, hogy a V8-as nagyon tudta összeállítani a teste ezt a funkciót egy meglehetősen kompakt gép kód:

Ez nem egyszerű feladat egy olyan környezetben, ahol minden dinamikusan és statikusan típusos teljesen világos, hogy mi


- Ami a hiányosságokat a motor?

- Előfordul, hogy egy erős kéz V8 válik gyengeségét. Ennek két oka van.
Az első helyen, sem dinamikus típusú kód V8 látni a statikus szerkezet, amely már nyilvánvaló, hogy a programozó, aki írta a kódot. Valahol azért történik, mert V8 valami még nem valósult meg, valahol - mert nem mindig lehetséges algoritmikusan.

Az egyik leggyakoribb példa - a kód a stílus:

Van V8 képes figyelmen kívül hagyni azt a tényt, hogy a a.f és B.F azonos viselkedés (korrigált értékének az elfogott változók), mint Ez a funkció létrehozott egy és ugyanaz a funkciója szó (function szó).

Másodszor, néha optimalizáló fordítót V8 egyszerűen nem támogatja valamilyen szerkezet a kódot, és a fordító nem hajlandó nézd meg a kódot. Például főtengely (ez az első megvalósítása a koncepció adaptív összeállítás V8) soha nem támogatta a try-catch / végül, és ezért nem volt hajlandó, hogy optimalizálja a funkciót, ahol részt vett. Most funkció, amely használja try-catch által összeállított turbó (compiler van helyettesítésére fejlesztették ki a főtengely), így a helyzet egyre jobb.

Harmadszor, néha a költség költött azonosítására egy statikus szerkezet, nem kifizetődő. V8 időt tölt az épület egy fa rejtett osztályokat, amely optimalizálja / deoptimiziruet / optimalizálja a kódot újra -, és a kódot nem javul, például azért, mert a tárgyak többnyire a szótárakat. Ez egy nagyon érdekes terület aggodalomra - hogyan lehet egyensúlyt a költségek kód optimalizálása és a teljesítmény javítását ebből optimalizálás. Hogyan programfuttatási elfogadható sebességgel, akkor is, ha a kód nem esik a nyilvánvaló gyors útvonal.

A munka az összes ezeket a problémákat végzik, és mivel minden esetben, ha a kód fut lassan V8, panaszt V8 fejlesztők - legalábbis nekik megmagyarázni, hogy miért a kód futása lassú, vagy az is lehet javítani valamit önmagában V8 .

- Mit gondolsz, mit jelent a kód optimalizálása egy adott motor (esetünkben - V8)? Végtére is, előfordul, hogy bizonyos böngésző kódot lelassul. Mi a teendő akkor?

- Két lehetőség van (vagy ezek kombinációi):

  • A „rossz” kódot. Ebben az esetben a teljesítmény általában szenved alapján azonnal több motor és optimalizálási motor mellett egy javul a teljesítmény-kód alapján azonnal több;
  • A „rossz” a motor kódot. Ebben az esetben, ahogy azt már korábban említettük, az szükséges, hogy küldjön egy hibajelentést motor fejlesztők, akik megjavítja maga a motor, vagy gyakran javasolnak egy út körül ezt a hibát.

- Tud sorolja a leggyakoribb „rake”, amely a fejlesztők jönnek a kódban (azaz, sőt, a leggyakoribb hibák a kódot, nagyban befolyásolja a teljesítményét tájékozódás V8 - keretében a fent említett helyzet, „a kódot rossz „)?

- Kétféle rake. Az első típus - a rake algoritmikus. Például az emberek néha ismételjük, sorban a stílus ciklus:

Sok kompilyatorschiki elkezd ugrál kissé a székében, és a kezét dörzsölve, amikor látják, mint egy kódot, hogy végre optimalizálást lenne egy ilyen ciklus át kell alakítani valami értelmes - ez borzasztóan érdekes kihívás. Ugyanakkor a szempontból a fejlesztő sokkal hatékonyabb, hogy észre, hogy mennyi s.substring a legjobb és a legrosszabb, és ez a kód nem írni. Mivel nem trükkös optimalizáció a motoron belül ciklus ideje komplexitása O (n 2).

A másik típusú villakarok - gereblye kapcsolódó optimalizálása dinamikus nyelvek (Már érintettem fent). Például egy polimorf kód, azaz kód, amely együttműködik a különböző tárgyakat. . Ilyen kódot az V8 gyakran kripton (kristályos radioaktív anyag jelenik meg a DC Comics univerzum Kryptonite híres, mert az egyetlen nem-mágikus gyengesége Superman és más kriptontsev - tudja őket befolyásolni, ami attól függően változik, az ásványi színek -. Ca. . szerk.) a Superman. A téma elég mély, és én ebben a témában van egy bejegyzést képekkel.

- Hogyan kell kezelni ezeket a problémákat? Keresés: „kódolási szabályok bizonyos motor” és ellenőrizze a kódot azok betartását?

- És ha megy vissza az említett kódszerkesztő problémák (a helyzet „rossz motor kód”)? Meg tudjuk adni néhány leggyakrabban jelentett problémát V8?

- Hibák általában nem jelenik meg „gyakran” vagy „nem túl gyakran.” Általában ez történik, hogy a hibát észre minden fejlesztő, akkor gyorsan javított, és ennyi volt. Bugs ebben az esetben vonatkozik csak egy kis populáció a fejlesztők, mert van egy nagyon különleges hely a megfelelő körülményeket feltételezve.

Egy gyakorlati példa: Egyszer megkértek, hogy nézd meg a kódot, amely valamilyen okból néha futni kezdett nagyon lassan. Kiderült, az összes kifejezést Math.floor (x * y). ahol x néha vált, értéke 1, és y értéke 0. Ez semmi különös, de Math.floor (x * y) ebben az esetben megegyezik bűvös szám „negatív nulla” (ami szinte teljesen 0-ra, de ha osztott, mondjuk 1 nulla, kiderül pozitív végtelen, és ha a szakadék 1 mínusz nulla, negatív végtelen kapunk). A főtengely-mindig feltételezzük, hogy az eredmény a padló műveletek - egy egész szám, ezért -0 - a szám nem ábrázolható, mint egész eredményezték deoptimization. A megoldás ebben az esetben váltotta Math.floor (x * y) (x * y) | 0 (általában, ez nem felel meg az átalakítás, de a kód, hogy szükség, hogy eloszlassa, nem játszanak szerepet). By the way, az utóbbi időben, ez a probléma főtengely javított egyszer és mindenkorra.

Én konkrétan választottam ezt a hibát, mint például azért, mert ez elég fura ( „mi mínusz nulla?”, „mi a deoptimization?”), abban a reményben, hogy meggyőzze az olvasót, hogy a tudás a konkrét hibákat teljesen haszontalan. Azt találtuk, hogy a kód, néztem, jön a ezt a hibát, nem azért, mert tudtam, hogy Math.floor irtózik -0. és a fegyveres ezzel a tudással ment vissza minden Math.floor a | 0. amíg a hibát nem oldotta meg ... Nem, nem találtam ezt a hibát, mert tudta, hogy kell profil a V8, bizonyos gombok kell futtatni a V8 megmutatta nekem egy listát deoptimization. Ezért a legfontosabb dolog, hogy megértsük, hogy a V8-as (és más JS VM) fut.
Ezzel a tudással, akkor mindig kitalálni, hogy „mit rontottam valahol a mély pincében”, majd panaszkodnak a magasabb hatóságok.
Én erről elég sok írás a blogomban, és még készül Tools, amely lehetővé teszi, hogy néz adatok teljesítményű V8-as (compiler IR, deopts stb), egy többé-kevésbé kényelmes formában.

- Te Dart most? Ha ez az új nyelv váltja majd fel a JS? Muszáj, hogy most a fejlesztő, hogy menjen egy új nyelvet? Mi az ő pozícióját az ipari?

Az egyik érdekes dolgok történnek a nyelvet nem a webhely, kiválaszthatja flutter.io - egy keretrendszer kialakítása cross-platform (Android iOS) mobil alkalmazások és dartino - Dart kis beágyazott rendszerek.

Köszönöm az interjút!

A fenti példák jól illusztrálják, hogy a puszta listája „egyszerű ajánlásokat adott motor” a kód optimalizálása nem elég - fontos, hogy megértsük, hogyan működik, és ugyanabban az időben tisztázni kell, milyen eredményeket szeretne elérni a program.