javascript установить Почему приращения операторов(++) с большими числами имеют низкую производительность?




javascript установить (2)

Я заметил, что при увеличении счетчика, оно значительно медленнее, когда значение счетчика большое. Я попробовал это в Chrome, Firefox и IE11, все показывают худшую производительность в больших количествах.

Смотрите тест jsperf here (код ниже):

var count1 = 0;
var count2 = new Date().getTime();
var count3 = 1e5;
var count4 = 1e9;
var count5 = 1e12;
var count6 = 1e15;

function getNum1() {
  return ++count1;
}

function getNum2() {
  return ++count2;
}

function getNum3() {
  return ++count3;
}

function getNum4() {
  return ++count4;
}

function getNum5() {
  return ++count5;
}

function getNum6() {
  return ++count6;
}

Почему это происходит?


Современные среды выполнения JavaScript и компиляторы выполняют оптимизацию под названием SMI (Small Integers).

Все числа в JavaScript - это числа с плавающей запятой двойной точности, которые относительно медленно выполняют вычисления. Однако на практике во многих случаях (например, в большинстве циклов for ) мы работаем с целыми числами.

Так что - очень полезно оптимизировать числа для выполнения эффективных вычислений, когда это возможно. Когда движок может доказать, что число представляет собой небольшое целое число, он с удовольствием будет относиться к нему как таковому и выполнять все вычисления, как если бы это число было целым числом.

Увеличение 32-разрядного целого числа является однопроцессорной операцией и очень дешево. Таким образом, вы получаете лучшую производительность, делая это.


Хотя это «большое» число, которое вы используете, действительно велико, я уверен, что это разница между обработкой 32-разрядного и более чем 32-разрядного количества. Попробуйте использовать 1 500 000,00 (32-разрядная подпись с подпрограммой), 3 000 000 000 (32-разрядная подпись с подпиткой) и 5 ​​000 000 000 (более 32-разрядная подпись).





javascript