我正在使用 JavaScript 函数来设置全局变量。下面,我有两个非常愚蠢的示例函数。一种是使用标签来打破嵌套循环。另一个使用空返回。
我的问题:从性能问题来看哪个更好? (为了论证起见,假设您这样做了几百万次。)
使用空返回
function foo() {
for(var i = 0; i < 100; ++i) {
for(var j = 0; j < 100; ++j) {
if(i * j == 50) {
myGlobal = j;
return;
}
}
}
}
使用标签和中断
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;
}
}
}
}
我知道除了在满足我的内在条件/我完成任务后完成功能外,我什么都不做。
谢谢!
最佳答案
经过一些测试(通过 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);
当比较嵌套循环(函数 r() 和 b() )的中断时,返回始终表现得更好。然而,当在函数(函数 r2() 和 b2() )中只使用 return 或 label/break 时,label/break 的执行速度要快得多。测试结果分割:
测试 1,使用 10000000 次迭代
3 次使用 return 离开嵌套循环后的平均运行时间(毫秒):1215 毫秒
3 次使用标签/中断离开嵌套循环后的平均运行时间(毫秒):1522 毫秒
测试 2,使用 1000000000 次迭代 //2 个数量级的更多迭代
3 次使用返回后的平均运行时间(毫秒):1879 毫秒
使用标签/中断 3 次运行后的平均运行时间(毫秒):1862 毫秒
因此:
为了打破嵌套循环,使用 return 快约 25%
对于科学/高性能计算,使用 label/break 快约 1%
关于javascript - 打破嵌套循环 : return or label/break?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22444033/