Нові оптимізації в Firefox скоротили розрив у продуктивності JavaScript і компільованих мов


Нові оптимізації в Firefox скоротили розрив у продуктивності JavaScript і компільованих мов

Розробники Mozilla повідомили про реалізацію в javascript-движку SpiderMonkey нової оптимізації операцій з плаваючою комою (float32), яка дозволила досягти нового рівня продуктивності web-додатків, що використовують підмножина Asm.js. Тестування продуктивності показало, що виконується в новій збірці Firefox javascript-додаток виконується приблизно в 1.5 рази повільніше, ніж скомпільована в машинний код реалізація того ж алгоритму на мові Сі. До внесення оптимізації спостерігалося розбіжність продуктивності в два рази.

На графіку: firefox – виконання javascript в браузері з float32-оптимізаціями, firefox-f32 – при додатковому використанні Emscripten з оптимізаціями float32Ускореніе спостерігається і при виконанні звичайного javascript-коду, особливо використовує спеціалізовані виклики Math.fround (), підтримка яких буде додана в Firefox 26. Проте, найбільший ефект досягається при застосуванні нового типу float32 в Asm.js, низкоуровневом підмножині мови javascript зі строгою типізацією, яке повністю сумісний зі звичайним javascript і може виконуватися в будь-яких браузерах. Якщо браузер не підтримує Asm.js, то код виконується як звичайний javascript, а якщо підтримує – включається додатковий оптимізує модуль, що враховує додані в код анотації. Наявність інформації про типи дозволяє використовувати не тільки JIT, а й попередню AOT-компіляцію, виконувану для всього коду до початку його виконання і генеруючу більш простий і ефективний машинний код. При цьому, на відміну від JIT-компіляції, Asm.js забезпечує передбачувану продуктивність і не залежить від збирача сміття.

В даний час Asm.js використовується в web-додатках, автоматично перетворених в javascript з мов C / C ++ за допомогою таких інструментів, як Emscripten і Mandreel. Для більш ефективного використання нових оптимізацій в компілятор Emscripten вже додана логіка, спрямована на більш активне використання типу float32 замість менш ефективного типу float64. При цьому оптимізації поки не включені за замовчуванням в Emscripten, так як ще не вирішені деякі супутні проблеми, такі як збільшення розміру підсумкової програми і уповільнення в деяких специфічних ситуаціях.

Примітно, що по тестах розробників javascript-код, безпосередньо маніпулює 32-розрядними обчисленнями з плаваючою точкою, за рахунок предкомпіляціі виконується з використанням движка SpiderMonkey іноді навіть швидше, ніж ті ж обчислення в програмі, отриманої в результаті компіляції в GCC або Clang. Загальний рівень продуктивності Asm.js наближається до значень, не сильно розходиться з показниками на яке різні нативні компілятори відрізняються між собою (наприклад, продуктивність clang і gcc в тестах box2d і copy розходиться майже в два рази).

Ссылка на основную публикацию