2

Я уверен, тестирование производительности ниже Javascript фрагмент кода под Firefox, Chrome и SafariПочему Firefox выполнить Javascript невероятно быстрее, чем другие браузеры

var f = function(x) { 
 
\t return Math.sin(x); 
 
} 
 

 
function testSpeed() { 
 
\t console.log("test started, please hold on..."); 
 
\t var time = Date.now(); 
 
\t for(var i = 0; i < 1000; i ++) { 
 
\t \t for(var x = 1; x < 200000; x ++) { 
 
\t \t \t f(x);//replace by Math.sin(x) here 
 
\t \t } 
 
\t } 
 
\t console.log("total time = " + ((Date.now() - time)/1000.0)); 
 
} 
 

 
testSpeed();

Результаты:

  • 0.12s под Firefox, то же самое, когда я заменяю f(x) звонок по Math.sin(x).
  • 5.2s под хром, при замене f(x) звонок по Math.sin(x).
  • 7.12s под Safari но удивительно только 0.56s, когда я заменяю f(x) вызов Math.sin(x).
  • Это делает Firefox ~ 50 раз быстрее, чем Chrome и ~ 70 раз быстрее, чем Safari, есть ли какая-то известная причина для этого?

    Также под Safari, почему прямой вызов Math.sin(x) делает огромную разницу (~ 13 раз быстрее) по сравнению с вызовом f(x)?

    +0

    интересный. даже край быстрее, чем хром. оценка: 0.287 –

    +1

    Какова скорость, когда вы полностью удаляете 'f (x)' вызов или удаляете тело 'f'? Поскольку он не имеет никакого эффекта, двигатель может разумно устранить его. – Ryan

    +0

    @ Ryan without f (x) Firefox сохраняет время выполнения 0.12s, Chrome неожиданно снижается до 0,18 и Safari до 0,54s, по какой-то причине вызовы функций резко влияют на производительность в Chrome и Safari. – ALTN

    ответ

    1

    Как указал Райан в комментариях, Firefox фактически замечал функцию, не имеющую никаких побочных эффектов, и ее возвращаемое значение не используется, тем самым безопасно опуская вызов. Изменение кода, как показано ниже сделано выполнение Firefox вырастет до 4.1s

    var f = function(x) { 
     
    \t return Math.sin(x); 
     
    } 
     
    
     
    function testSpeed() { 
     
    \t console.log("test started, please hold on..."); 
     
    \t var time = Date.now(); 
     
    \t var y; 
     
    \t for(var i = 0; i < 1000; i ++) { 
     
    \t \t for(var x = 1; x < 200000; x ++) { 
     
    \t \t \t y = f(x); 
     
    \t \t } 
     
    \t } 
     
    \t console.log("total time = " + ((Date.now() - time)/1000.0) + " " + y); 
     
    } 
     
    
     
    testSpeed();

    Заметим, что без регистрации y в конце вложенного цикла, Firefox еще заметил неиспользованную возвращаемое значение и опущенным вызов функции. Время исполнения составляет 0,12 с, когда y остается неиспользованным.

    А почему Safari идет быстрее при вызове Math.sin(x) я просто процитировать комментарий Райан:

    Safari появляется также признать, что Math.sin чист и выполнять же оптимизацию, когда вы используете его непосредственно, но не расширяет его до f в этом случае.