Mat*_*bst 4 javascript performance return break nested-loops
我正在使用JavaScript函数来设置全局变量.下面,我有两个非常愚蠢的示例函数.一个使用标签来打破嵌套循环.另一个使用空回报.
我的问题:从性能问题来看哪个更好?(为了争论,我们可以说你做了几百万次.)
使用空返回
function foo() {
for(var i = 0; i < 100; ++i) {
for(var j = 0; j < 100; ++j) {
if(i * j == 50) {
myGlobal = j;
return;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用标签和休息
function foo() {
dance:
for(var i = 0; i < 100; ++i) {
for(var j = 0; j < 100; ++j) {
if(i * j == 50) {
myGlobal = j;
break dance;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我知道除了在满足我的内心条件/完成任务后完成功能,我什么都不做.
谢谢!
经过一些测试(通过Chrome控制台,MBP 2013,OSX 10.9,Intel i7 @ 2.8GHz,16GB DDR3),结果非常有趣.我运行了两种类型的测试.第一个测试使用return和label/break来打破嵌套循环.第二个使用直接返回和标签/中断,功能中没有其他内容.测试代码:
function r() {
for(var i = 0; i < 10; ++i) {
for(var j = 0; j < 10; ++j) {
if(i*j == 50) {
return;
}
}
}
}
function b() {
dance:
for(var i = 0; i < 10; ++i) {
for(var j = 0; j < 10; ++j) {
if(i*j == 50) {
break dance;
}
}
}
}
function r2() {
return;
}
function b2() {
dance:
break dance;
}
var startTime;
var endTime;
console.log("Return test");
startTime = Date.now();
for(var i = 0; i < 1000000000; ++i) {
r2();
}
endTime = Date.now();
console.log(endTime - startTime);
console.log("Break test");
startTime = Date.now();
for(var i = 0; i < 1000000000; ++i) {
b2();
}
endTime = Date.now();
console.log(endTime - startTime);
Run Code Online (Sandbox Code Playgroud)
当比较嵌套循环(函数r()和b())时,返回一致地表现得更好.但是,当在函数中使用return或label/break(函数r2()和b2())时,标签/ break的执行速度要快得多.测试结果细分:
测试1,使用10000000次迭代
使用return返回离开嵌套循环3次后的平均运行时间(毫秒):1215ms
使用label/break进行3次运行后,平均运行时间(毫秒)离开嵌套循环:1522ms
测试2,使用1000000000次迭代 //多次迭代2个数量级
使用return返回3次后的平均运行时间(毫秒):1879ms
使用标签/中断3次运行后的平均运行时间(毫秒):1862ms
从而:
对于破坏嵌套循环,使用return会快〜25%
对于科学/ HPC,使用标签/中断的速度要快1%