Почему вызов функции в генераторе выполняется быстрее? - PullRequest
0 голосов
/ 24 января 2019

function* test() {
  console.time("function-call")
  loop();
  console.timeEnd("function-call");

  console.time("in-function");
  var i, j;
  i = 0;
  while (i < 10000) {
    j = 0;
    while (j < 10000) {
      j++
    }
    i++;
  }
  console.timeEnd("in-function");
}

function loop() {
  var i, j;
  i = 0;
  while (i < 10000) {
    j = 0;
    while (j < 10000) {
      j++
    }
    i++;
  }
}

test().next();

Я скопировал кодовый блок в «цикл» и вставил в функцию «тест» для сравнения времени.

function-call: 84ms 
in-function: 596ms

вызов функции намного быстрее, чем зацикливание внутри функции. Почему это так?

1 Ответ

0 голосов
/ 24 января 2019

@ Cristian Traìna Node не позволяет пропускать пустые циклы.Эти оптимизации допускаются только в скомпилированных языках, таких как Pascal или C / C ++, с флагами, такими как -O2.

. Для этой программы

var max=process.argv[2];
for(var i=0;i<=max;i++){} // with let results is the same

Мы можем получить следующую зависимость времени выполнения отколичество петель.Это график LogLog.Первая плоская область it domain, когда доминирующая часть времени выполнения - это запуск NodeJ.После 1М циклов вы можете видеть, что число итераций увеличивается со временем линейно.Максимальное измерение занимает около 1000 секунд, поэтому V8 не пропускает пустой цикл.

Возвращаясь к сценарию из вопроса:

  • Chrome 71.0.3578.98
function-call: 154.878662109375ms
in-function: 153.7490234375ms
  • Узел v10.15.0
function-call: 154.183ms
in-function: 152.907ms
  • Firefox Quantum 64.0
function-call: 156 ms debugger eval code:4:3
in-function: 1519 ms
  • Хром 71.0.3578.98
function-call: 158.954345703125ms
in-function: 153.663818359375ms
  • Вивальди 2.2
function-call: 153.548095703125ms
in-function: 153.755126953125ms
  • Опера 58.0.3135.47
function-call: 154.34814453125ms
in-function: 154.729248046875ms

Компьютер тестирует мой друг:

  • Edge
function-call: 3 496,6 ms
in-function: 2 330,9 ms
  • Chrome
function-call: 70.69580078125ms
in-function: 70.43310546875ms

Так что теперь, похоже, проблема с Firefox и Edge.

Любой из этих браузеров, кроме Firefox и Edge, использует движок V8.Firefox описан здесь:

https://www.digitaltrends.com/web/mozilla-firefox-new-browser-engine-quantum-2017/

и использует Quantum Flow:.

Пограничная команда думает о внедрении Chromium Engine

https://www.pcmag.com/news/365345/microsofts-edge-browser-to-adopt-googles-chromium-engine

Из этой статьи

https://blog.mozilla.org/blog/2018/12/06/goodbye-edge/

Мы видим, что в будущем будут поддерживаться только Chromium from Google и Gecko Quantum from Mozilla.

Если у кого-то есть доступ к Safari или Edge, добавьте тесты.

...