Подтвердить что ты не робот

Firefox, похоже, не работает быстрее, используя профиль asm.js, но Chrome

Я пытаюсь понять, как работает ASM и когда он вступает.

Я взял небольшую функцию с веб-сайта asm.js. Я обертываю его с помощью шаблона модуля: один раз для asm, один раз с тем же синтаксисом, но без аннотации "use asm" и один раз, как vanilla-javascript.

 var add_asm = (function MyAOTMod(stdlib, foreign, heap) {
  "use asm";
  var sqrt = stdlib.Math.sqrt;

  function square(x) {
    x = +x;
    return +(x * x);
  }
  return function(x, y) {
    x = +x; // x has type double
    y = +y; // y has type double
    return +sqrt(square(x) + square(y));
  };
}(window));

var add_reg_asmstyle = (function MyAsmLikeRegularMod() {

  function square(x) {
    x = +x;
    return +(x * x);
  }
  return function(x, y) {
    x = +x; // x has type double
    y = +y; // y has type double
    return +Math.sqrt(square(x) + square(y));
  };
}());


var add_reg = (function MyStrictProfile() {
  "use strict";
  return function(x, y) {
    return Math.sqrt(x * x + y * y);
  };
}())

Я создал небольшой jsperf: код jsperf немного отличается от приведенного выше, включая подсказки из обсуждения ниже http://jsperf.com/asm-simple/7

Производительность показывает, что firefox 22 является самым медленным с помощью asm-синтаксиса (с аннотацией "asm" или без него), а хром быстрее в asm-режиме.

Итак, мой вопрос: как это возможно? Я ожидаю, что Firefox будет самым быстрым в режиме asm. Я бы не ожидал увидеть разницу для Chrome. Я использую неправильный синтаксис asm? Что мне не хватает?

Приветствуются любые советы или разъяснения. Спасибо,

4b9b3361

Ответ 1

Когда вы запускаете код в Firefox, вы часто можете увидеть значительное снижение скорости для вызовов asm.js, что, скорее всего, вызвано повторной компиляцией (которая видна на консоли) или стоимостью js-to-asm-вызовов, Эта гипотеза еще более усиливается Люк Вагнер, разработчик asm.js:

одна ошибка производительности, которую мы уже знаем, попытка сопоставления asm.js заключается в том, что вызов из non-asm.js в asm.js и наоборот намного медленнее, чем обычные вызовы из-за общедоступные процедуры ввода/выхода. Мы планируем исправить это в следующем несколько месяцев, но, тем временем, для целей бенчмаркинга, попробуйте сохраняйте все вычисления в одном модуле asm.js, не призывая и не выходить.

Чтобы убедиться в этом сами - посмотрите на скрипку: http://jsperf.com/asm-simple/10

  • Firefox 26: 22,600K ops/sec в случае asm-asm vs 300 (!) в случае asm-js.
  • Chrome 28: 18K против 13K
  • IE11: ~ 7.5K для всех тестов, не наблюдается большой разницы, кроме эллиминации мертвого кода, где он сияет;)