Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript比较运算符,是否比===更有效?_Javascript_Performance - Fatal编程技术网

Javascript比较运算符,是否比===更有效?

Javascript比较运算符,是否比===更有效?,javascript,performance,Javascript,Performance,最近有人告诉我,三重相等运算符更有效,因为它在比较之前不会尝试转换任何变量。从未考虑过性能影响 有没有人知道各种比较运算符或其他可能减慢框架速度的常见JS运算符的性能 是否存在这是一个因素的复杂对象类型 我意识到这可能只与边缘案例有关,但如果没有具体数据,很难说。这并不是我问题的答案,只是一个边缘示例: 对于字符串和浮点(例如:0.035==“0.035”)之间的100K或更多比较,显然有大约1000%或10倍的明显性能差异。在铬v77上测试 如果有一个框架在幕后进行大量比较,我可以看到这会如何

最近有人告诉我,三重相等运算符更有效,因为它在比较之前不会尝试转换任何变量。从未考虑过性能影响

有没有人知道各种比较运算符或其他可能减慢框架速度的常见JS运算符的性能

是否存在这是一个因素的复杂对象类型


我意识到这可能只与边缘案例有关,但如果没有具体数据,很难说。

这并不是我问题的答案,只是一个边缘示例:

对于字符串和浮点(例如:0.035==“0.035”)之间的100K或更多比较,显然有大约1000%或10倍的明显性能差异。在铬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 }%`)

print('string vs float comparison operator performance')
让我们开始=Date.now();
设loopCount=10000000;
设appxLoopCostRatio=2857;
for(设i=0;i
应该是,因为它执行的操作较少<代码>=如果两个参数的类型不同,则在比较之前执行类型转换。下面是伪代码

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)
}

但是,如果将
=
=
与相同类型的两个输入进行比较,差异应该非常小,甚至为零,因为不需要转换。

。。。当微秒对你很重要时:与几乎所有这些微基准相似“这个简单的技巧可以提高你的性能!”蛇油故事:不值得你花时间,不会成为你程序的瓶颈。通常更糟糕的是,重构代码以符合这些要求通常会降低代码的可读性,从而造成真正的瓶颈(由于编程缺陷,可读性差导致)。这样的测试结果是不可预测的,因为很多事情都可能在幕后发生。JS运行时通过许多阶段“就地”编译和优化代码。每个编译器能够实现(或决定实现)的优化级别以及编译时间本身可能会考虑在内