производительность: рекурсивная - нерекурсивная (IE) - PullRequest
3 голосов
/ 04 апреля 2011

У меня есть 2 функции для вычисления n! (факториал). Первая - рекурсивная функция, вторая - прямой цикл. Я проверил их производительность в jsperf.com . Для всех браузеров, которые я тестировал, нерекурсивная функция превосходит рекурсивную, , кроме IE (протестировано для v7, 8 и 9). Теперь я очень привык к тому, что IE и jscript являются исключением, но в этом случае я стараюсь: в чем может быть причина различия (другими словами, если я хочу, чтобы мой факториал был быстрым в каждом браузере, я должен действительно проверить браузер первым;)?

Используются следующие функции:

//recursive
function factorial(n) {  
 var result = 1,      
 fac = function(n) {    
         return result *= n, n--, (n > 1 ? fac(n) : result);      
       };  
 return fac(n); 
}
//nonrecursive
function factorialnr(n){
  var r = n;  
  while (--n > 1) {   
    r *= r != n ? n : 1;  
  }  
  return r; 
}

Ответы [ 2 ]

1 голос
/ 04 апреля 2011

Возможно, потому что браузер не может оптимизировать хвостовую рекурсию .Он не понимает, что ваша лямбда-функция может быть переписана итеративно и исключить накладные расходы при вызове функции.

Браузеры на самом деле не должны быть полноценными компиляторами, и я не ожидаю, что они смогутвыполнить все оптимизации, которые выполняют традиционные компиляторы.Если определенный браузер может выполнять определенную оптимизацию, это замечательно.Но это не значит, что все будут.

0 голосов
/ 05 апреля 2011

Я посмотрел дальше, но ничего не могу найти по этому вопросу. После тестирования кажется, что удаление троицы в версии 1 теста jsperf заставило IE вести себя как другие браузеры (см. rev 5 теста jsperf ). Но тестирование троичного на собственном действительно не показало различий.

Хорошо, давайте оставим это этому. Здесь я узнал, что желательно посмотреть, можно ли переписать рекурсивную функцию итеративным способом. Последний, похоже, превосходит рекурсию.

Спасибо за ваши ответы, оценил это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...