Javascript - internet explorer 10 - windows 8 - ieblog російський

Продуктивність для реальних веб-додатків

Javascript - internet explorer 10 - windows 8 - ieblog російський

Javascript - internet explorer 10 - windows 8 - ieblog російський

Вимірювання продуктивності веб-додатків

Внутрішні завдання Chakra

  • Мінімізація обсягу роботи, виконуваної на критичному шляху для взаємодії з користувачем. Це включає в себе затримку виконання якомога більшої частини роботи до тих пір, поки без нього вже не можна буде обійтися, повне припинення роботи, використання періодів неактивності і розпаралелювання роботи з метою мінімізації впливу, який чиниться на час відгуку програми.
  • Використання переваг доступного устаткування. Це означає використання всіх доступних ядер ЦП, а також створення розширених спеціалізованих інструкцій ЦП, наприклад SSE2 компанії Intel, якщо вони є.

Javascript - internet explorer 10 - windows 8 - ieblog російський

Паралельна архітектура обробника Chakra

Коли ця кількість сягає певного порогового значення, інтерпретатор передає функцію в чергу для компіляції. На відміну від інших браузерів JIT-компілятор Chakra запускається в окремому виділеному потоці і не впливає на виконання скриптів. Єдине завдання цього компілятора полягає в створенні оптимізованих машинних команд для кожної з функцій в черзі компіляції. Після компіляції функції в основний потік скрипта відправляється сигнал про доступність машинного коду. При наступному виклику точка входу в функцію перенаправляється на тільки що скомпільований машинний код, і виконання триває безпосередньо в ЦП. Слід зазначити, що функції, які викликаються один-два рази, взагалі не компілюються, що дозволяє економити час і ресурси.

Малий час завантаження сторінки

Щоб оптимізувати такі сценарії, Chakra здійснює тільки самий базовий синтаксичний розбір вихідного коду. Інша частина роботи (побудова дерева абстрактного синтаксису і створення байт-коду) виконується для однієї функції за раз і тільки тоді, коли відповідна функція буде скоро викликана. Описана стратегія не тільки допомагає підвищити швидкість відгуку браузера при завантаженні веб-сторінок, але і скорочує обсяг використовуваної пам'яті.

Перегляд і поліпшення JIT-компілятора

function compute (v, w)

В Internet Explorer 9 компілятор Chakra створював код, який виявляв кожне з властивостей під час виконання і обробляв все достовірно можливі операції (в наведеному вище прикладі це додавання цілих чисел, додавання чисел з плаваючою комою або навіть об'єднання рядків). Деякі з цих операцій оброблялися безпосередньо в машинному коді, для інших потрібна Виконавча Chakra.

Інтерпретатор збирає дані про можна побачити їм запусках, однак існує ймовірність, що виконання програми призведе до таких значень під час виконання, які порушують допущення, зроблені при створенні оптимізованого коду. Для кожного прийнятого допущення компілятор виконує перевірку в середовищі виконання. Якщо при подальшому виконанні виникає несподіваного значення, перевірка завершується зі збоєм, виконання в аварійному режимі виводиться зі спеціалізованого машинного коду і триває в інтерпретаторі. Реєструється причина такого аварійного виведення (невдала перевірка), інтерпретатор збирає додаткові відомості про профіль, а потім робиться повторна компіляція функції при інших припущеннях. Аварійна зупинка і повторна компіляція є дві абсолютно нові можливості в Internet Explorer 10.

В результаті компілятор Chakra в Internet Explorer 10 створює для коду менше машинних команд, що скорочує загальний обсяг використовуваної пам'яті і прискорює виконання. Це надає особливо сильний вплив на додатки з арифметичними операціями з плаваючою комою і операціями доступу до властивостей об'єктів, в число яких входять симуляції та ігри HTML5.

Прискорення арифметичних операцій з плаваючою комою

function findString (s, a)

for (var i = 0, al = a.length; i if (a [i] == s) return i;

function compute (a, b, c, d)

return (a + b) * (c - d);

В Internet Explorer 10 компілятор використовує переваги інформації у профілі, зібраних інтерпретатором, для створення коду, який незрівнянно швидше обробляє значення з плаваючою комою. Якщо в наведеному вище прикладі профіль вказує на те, що всі аргументи з великою ймовірністю будуть числами з плаваючою комою, компілятор видає машинні команди для значень з плаваючою комою. Повністю цей вислів буде розраховане всього за три машинні команди (за умови, що всі аргументи вже знаходяться в регістрах), всі проміжні значення будуть збережені в регістрах і для повернення остаточного результату потрібно всього одне розподіл з купи.

Для додатків з великим числом операцій з плаваючою комою це забезпечує приголомшливий приріст продуктивності. Експерименти показують, що операції з плаваючою комою в Internet Explorer 10 виконуються приблизно на 50% швидше, ніж в Internet Explorer 9. Крім того, скорочення обсягу виділеної пам'яті дозволяє зменшити число збірок сміття.

Прискорений доступ до об'єктів і властивостями

return Math.sqrt (this .x * this .x + this .y * this .y + this .z * this .z);

В Internet Explorer 9 ми ввели вбудований кеш, який значно прискорив доступ до властивостей. Вбудований кеш запам'ятовує форму об'єкта і розташування в пам'яті об'єкта, де можна знайти заданий властивість. Вбудований кеш може запам'ятати тільки одну форму об'єкта і є ефективним, коли всі об'єкти, з якими працює функція, мають однакову форму. В Internet Explorer 10 ми додали механізм вторинного кешування, який покращує продуктивність коду, що працює з об'єктами різної форми (поліморфізм).

Перед зчитуванням значення властивості компілятор повинен перевірити, що форма об'єкта відповідає формі, збереженої у вбудованому кеші. Для цього компілятор в Internet Explorer 9 перед кожним доступом до властивості виконує перевірку форми в середовищі виконання. Оскільки програми часто зчитують або записують кілька властивостей одного об'єкта поспіль (як у наведеному нижче прикладі), всі ці перевірки збільшують додаткові витрати часу.

function collide (b1, b2)

var dx = b1.x - b2.x;

var dy = b1.y - b2.y;

var dvx = b1.vx - b2.vx;

var dvy = b1.vy - b2.vy;

var distanceSquare = (dx * dx + dy * dy) || 1.0;

Chakra в Internet Explorer 10 створює код, орієнтований на очікувану форму об'єкта. Завдяки ретельному відстеженню символів в поєднанні з можливостями аварійної зупинки і повторного компіляції новий компілятор значно скорочує кількість перевірок форми в середовищі виконання. У наведеному вище прикладі замість 8 окремих перевірок форми виконується всього 2 - по одній для b1 і b2. Крім того, після установки форми об'єкта все розташування властивостей стають відомі, тому операції читання або запису виконуються так само ефективно, як і в C ++.

У ECMAScript 5 об'єкти можуть містити нові види властивостей, які називаються властивостями методу доступу. Властивості методу доступу відрізняються від звичайних властивостей даних викликом настроюються функцій get і set для обробки операцій читання і запису. Властивості методу доступу є зручний механізм для додавання інкапсуляції даних, що обчислюються властивостей, перевірки даних і повідомлень про зміни. При розробці системи внутрішніх типів і вбудованого кеша обробника Chakra була передбачена сумісність з властивостями методу доступу і можливість ефективного зчитування і запису їх значень.

var Vector = function (x, y, z)

var m = Math.sqrt ((this .x * this .x) + (this .y * this .y) + (this .z * this .z));

return new Vector (this .x / m, this .y / m, this .z / m);

add. function (v, w)

return new Vector (w.x + v.x, w.y + v.y, w.z + v.z);

cross. function (v, w)

return new Vector (-v.z * w.y + v.y * w.z, v.z * w.x - v.x * w.z, -v.y * w.x + v.x * w.y);

Покращення збірки сміття

В Internet Explorer 10 ми внесли кілька поліпшень для процесів виділення пам'яті і збірки сміття. Ми вже розглянули зміни в структурі об'єктів і створення машинного коду, орієнтованого на арифметичні операції з плаваючою комою, що дозволило скоротити обсяг виділеної пам'яті. Крім того, тепер Chakra виділяє кінцеві об'єкти (наприклад, числа і рядки) з окремою області пам'яті. Кінцеві об'єкти не містять покажчики на інші об'єкти, тому їм не потрібно видаляти при складанні сміття стільки уваги, скільки звичайних об'єктів. Виділення кінцевих об'єктів з окремою області надає дві переваги. По-перше, на етапі розмітки всю цю область можна пропустити, що скорочує тривалість всього етапу. По-друге, під час супутньої збірки сміття нові виділення з області кінцевих об'єктів не вимагають повторного сканування порушених сторінок. Оскільки складальник Chakra працює одночасно з основним потоком скрипта, що виконується скрипт може змінювати або створювати об'єкти на вже оброблених сторінках. Щоб запобігти передчасному збір таких об'єктів, перед початком етапу розмітки Chakra встановлюється для сторінок захист від запису. Сторінки, в які на етапі розмітки виконувалася запис, пізніше повинні пройти повторне сканування в основному потоці скрипта. Оскільки для кінцевих об'єктів така обробка не потрібна, сторінки з області кінцевих об'єктів не потрібно захищати від запису або повторно сканувати пізніше. Це дозволяє заощадити цінний час в основному потоці скрипта і скоротити паузи. Дана зміна дуже вигідно для анімацій та ігор HTML5, так як вони часто перевантажені операціями з плаваючою комою і використовують значну частину виділеної пам'яті для зберігання чисел, упакованих в купу.

В Internet Explorer 10 ми вирішили цю проблему за допомогою координування збірок сміття з роботою інших компонентів браузера. Тепер Chakra відкладає збірку сміття до кінця виконання скрипта, а після періоду неактивності скрипта запитує з браузера зворотний виклик. Якщо цей період закінчується до виконання будь-якого скрипта, Chakra запускає збірку сміття, в іншому випадку збірка знову відкладається. Дана методика дозволяє скоротити обсяг використовуваної пам'яті, коли браузер неактивний (або неактивна одна з його вкладок), а також істотно зменшити частоту збірок сміття в додатках з великою кількістю анімації.

висновок

Схожі статті