Почему «использование строгого» повышает производительность в 10 раз в этом примере?

В ответ на вопрос производительность Я действительно заинтригован, потому что просто добавляю "use strict" в String.prototype метод улучшил производительность в 10 раз. объяснение bergi коротка и не объясняет это мне. Почему между двумя почти идентичными методами существует такое разительное отличие, которое отличается только "use strict" вверху? Можете ли вы объяснить более подробно и с теорией, стоящей за этим?

 String.prototype.count = function(char) {
  var n = 0;
  for (var i = 0; i < this.length; i++)
    if (this[i] == char) n++;
  return n;
};

String.prototype.count_strict = function(char) {
  "use strict";
  var n = 0;
  for (var i = 0; i < this.length; i++)
    if (this[i] == char) n++;
  return n;
};
// Here is how I measued speed, using Node.js 6.1.0

var STR = '0110101110010110100111010011101010101111110001010110010101011101101010101010111111000';
var REP = 1e4;

console.time('proto');
for (var i = 0; i < REP; i++) STR.count('1');
console.timeEnd('proto');

console.time('proto-strict');
for (var i = 0; i < REP; i++) STR.count_strict('1');
console.timeEnd('proto-strict');

Результат:

proto: 101 ms
proto-strict: 7.5 ms
121 голос | спросил exebook 16 J000000Saturday16 2016, 16:09:48

1 ответ


0

В строгом режиме this контекст не обязательно должен быть объектом. Если вы вызываете функцию для необъекта, this будет просто не-объектом.

Напротив, в нестрогом режиме контекст this всегда сначала переносится в объект, если он еще не является объектом. Например, (42).toString() сначала переносит 42 в объект Number и затем вызывает Number.prototype.toString объект Number как контекст this. В строгом режиме контекст this остается без изменений и просто вызывает Number.prototype.toString с 42 как this контекст.

 (function() {
  console.log(typeof this);
}).call(42); // 'object'

(function() {
  'use strict';
  console.log(typeof this);
}).call(42); // 'number'

В вашем случае версия в нестрогом режиме тратит много времени на обертывание и развертывание примитивных string в String обертки объектов и обратно. Версия строгого режима, с другой стороны, напрямую работает с примитивом string, что повышает производительность.

ответил Mattias Buelens 16 J000000Saturday16 2016, 16:31:37

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132