Операторы сравнения Javascript, === более эффективны, чем ==? - PullRequest
0 голосов
/ 24 октября 2019

Мне недавно сказали, что оператор тройного равенства более эффективен, потому что он не будет пытаться преобразовать ни одну из переменных перед сравнением. Никогда не задумывался о влиянии на производительность.

Есть ли у кого-нибудь информация о производительности различных операторов сравнения или других распространенных операторов JS, которые могут замедлить каркас?

Существуют ли сложные типы объектов, где этофактор?

Я понимаю, что это может относиться только к крайним случаям, но без конкретных данных трудно сказать.

Ответы [ 2 ]

1 голос
/ 24 октября 2019

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

function doubleEquals(a, b) {
  [a, b] = coerceTypes(a, b)
  return compareSameType(a, b)
}

function tripleEquals(a, b) {
  if (!areSameType(a, b)) {
    return false
  }
  return compareSameType(a, b)
}

Если вы сравните == и === с двумя входами одного и того же типа, разница должна быть очень мала или отсутствует, поскольку преобразование не потребуется.

0 голосов
/ 24 октября 2019

На самом деле это не ответ на мой вопрос, а только один крайний пример:

Для 100К или более сравнений между строкой и плавающей точкой (например: 0.035 == "0.035") кажется, что естьбезусловно, заметная разница в производительности составляет около 1000%, или в 10 раз. Как проверено на Chrome v77.

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

Для примера см. Код ниже.

print('string vs float comparison operator performance')
let start = Date.now();
let loopCount = 10000000;
let appxLoopCostRatio = 2857;

for (let i=0; i < loopCount; i++) {
  let x = Math.random();
  let y = Math.random().toString();
  if (x == y) count++;
}

let mid = Date.now();

for (let i=0; i < loopCount; i++) {
  let x = Math.random();
  let y = Math.random().toString();
  if (x === y) count++;
}

let mid2 = Date.now();

//no comparison
for (let i=0; i < loopCount; i++) {
  let x = Math.random();
  let y = Math.random().toString();
}

let finish = Date.now();

let a, b, cost;
a = mid-start;
b = mid2-mid;
cost = finish-mid2;
print('runtime == comparison:', mid-start);
print('runtime === comparison:', mid2-mid);
print('appx cost of variable generation:', finish-mid2);
let expectedCost = (loopCount / appxLoopCostRatio);
let TcCost = (b-cost < (expectedCost * 0.05)) ? (expectedCost * 0.05) : b-cost;
print(` === is more efficient by ${Math.floor((a-cost)/TcCost) * 100 }%`)

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