哪个布尔值更快? < 或 <=
Which Boolean is Faster? < or <=
我正在做一些涉及在浏览器中处理大量数据的工作。因此,我正在努力优化一切细节。我不需要任何人告诉我我在浪费时间,或者过早的优化是万恶之源。
我只想知道是否有人了解 JS 的工作原理,知道小于布尔值 运行s 是否比小于等于布尔值快。我的意思是,会:
return (i<2? 0:1)
被解析并且 运行 比:
return (i<=1? 0:1)
在这个例子中,我们假设 i 是一个整数。谢谢
我使用 performance.now API 和 console.time API 创建了一个 fiddle
API 都表示执行 functions/loops 花费了多少毫秒的时间。
我觉得主要的区别在于结果,performance.now 给出了更准确的值,即高达 1/1000 毫秒。
https://jsfiddle.net/ztacgxf1/
function lessThan(){
var t0 = performance.now();
console.time("lessThan");
for(var i = 0; i < 100000; i++){
if(i < 1000){}
}
console.timeEnd("lessThan");
var t1 = performance.now();
console.log("Perf -- >>" + (t1-t0));
}
function lessThanEq(){
var t0 = performance.now();
console.time("lessThanEq")
for(var i = 0; i < 100000; i++){
if(i <= 999){}
}
console.timeEnd("lessThanEq");
var t1 = performance.now();
console.log("Perf -- >>" + (t1-t0));
}
lessThan()
lessThanEq()
我没有太大区别。可能迭代更多可能会得到不同的结果。
希望对您有所帮助。
我不会称之为微优化,而是纳米优化。
案例非常相似,您的测量精度很可能低于您预期的增益...
(编辑)
如果优化此代码,生成的汇编代码将仅从 JA 更改为 JAE(在 (x86) 中,并且它们使用相同的循环计数。0,0000% 更改。
如果不是,您可能会在 select
引擎中赢得一步...
烦人的是它让你错过了大局:除非我错了,否则你需要一个分支,如果你担心时间,你输入的统计分布会影响更多执行时间。 (但还是没那么多...)
所以退一步比较一下:
if (i<2)
return 0;
else
return 1;
和:
if (i>=2)
return 1;
else
return 0;
你看到 for ( 100, 20, 10, 1, 50, 10) (1) 会分支更多,而 for (0, 1, 0, 0, 20, 1), (2) 分支更多.
这将带来更大的不同……这可能也很难衡量!!!
(作为留给 reader 的问题,我想知道 return +(i>1)
是如何编译的,是否有避免分支的技巧...)
(顺便说一句,我并不反对早期优化,我什至在这里发布了一些建议,如果您可能感兴趣的话:https://gamealchemist.wordpress.com/2016/04/15/writing-efficient-javascript-a-few-tips/)
JavaScript 标准描述了评估这些表达式需要采取的步骤。你可以看一下ECMAScript 2015 Language Specification,第12.9.3节
请注意,即使这两个操作的步骤之间存在细微差别,应用程序中的其他内容对性能的影响也会比您在 JavaScript 中无法控制的这些简单操作大得多。例如垃圾收集器的工作,即时编译器,...
即使您尝试在 JavaScript 中测量时间,这也不会奏效,因为仅获取时间戳对性能的影响比您要测量的实际表达式要大得多。此外,您编写的代码可能不是真正经过评估的代码,因为我可能会在实际 运行 代码之前由引擎进行一些预优化。
我正在做一些涉及在浏览器中处理大量数据的工作。因此,我正在努力优化一切细节。我不需要任何人告诉我我在浪费时间,或者过早的优化是万恶之源。
我只想知道是否有人了解 JS 的工作原理,知道小于布尔值 运行s 是否比小于等于布尔值快。我的意思是,会:
return (i<2? 0:1)
被解析并且 运行 比:
return (i<=1? 0:1)
在这个例子中,我们假设 i 是一个整数。谢谢
我使用 performance.now API 和 console.time API 创建了一个 fiddle API 都表示执行 functions/loops 花费了多少毫秒的时间。 我觉得主要的区别在于结果,performance.now 给出了更准确的值,即高达 1/1000 毫秒。
https://jsfiddle.net/ztacgxf1/
function lessThan(){
var t0 = performance.now();
console.time("lessThan");
for(var i = 0; i < 100000; i++){
if(i < 1000){}
}
console.timeEnd("lessThan");
var t1 = performance.now();
console.log("Perf -- >>" + (t1-t0));
}
function lessThanEq(){
var t0 = performance.now();
console.time("lessThanEq")
for(var i = 0; i < 100000; i++){
if(i <= 999){}
}
console.timeEnd("lessThanEq");
var t1 = performance.now();
console.log("Perf -- >>" + (t1-t0));
}
lessThan()
lessThanEq()
我没有太大区别。可能迭代更多可能会得到不同的结果。
希望对您有所帮助。
我不会称之为微优化,而是纳米优化。
案例非常相似,您的测量精度很可能低于您预期的增益...
(编辑)
如果优化此代码,生成的汇编代码将仅从 JA 更改为 JAE(在 (x86) 中,并且它们使用相同的循环计数。0,0000% 更改。
如果不是,您可能会在 select
引擎中赢得一步...
烦人的是它让你错过了大局:除非我错了,否则你需要一个分支,如果你担心时间,你输入的统计分布会影响更多执行时间。 (但还是没那么多...)
所以退一步比较一下:
if (i<2)
return 0;
else
return 1;
和:
if (i>=2)
return 1;
else
return 0;
你看到 for ( 100, 20, 10, 1, 50, 10) (1) 会分支更多,而 for (0, 1, 0, 0, 20, 1), (2) 分支更多.
这将带来更大的不同……这可能也很难衡量!!!
(作为留给 reader 的问题,我想知道 return +(i>1)
是如何编译的,是否有避免分支的技巧...)
(顺便说一句,我并不反对早期优化,我什至在这里发布了一些建议,如果您可能感兴趣的话:https://gamealchemist.wordpress.com/2016/04/15/writing-efficient-javascript-a-few-tips/)
JavaScript 标准描述了评估这些表达式需要采取的步骤。你可以看一下ECMAScript 2015 Language Specification,第12.9.3节
请注意,即使这两个操作的步骤之间存在细微差别,应用程序中的其他内容对性能的影响也会比您在 JavaScript 中无法控制的这些简单操作大得多。例如垃圾收集器的工作,即时编译器,...
即使您尝试在 JavaScript 中测量时间,这也不会奏效,因为仅获取时间戳对性能的影响比您要测量的实际表达式要大得多。此外,您编写的代码可能不是真正经过评估的代码,因为我可能会在实际 运行 代码之前由引擎进行一些预优化。