经过一些测试(通过Chrome控制台,MBP 2013,OSX 10.9,Intel i7 @ 2.8GHz,16GB DDR3),结果非常有趣。我进行了两种类型的测试。第一个测试使用return和label/break来跳出嵌套循环。第二个测试使用直接的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())时,使用 return 的表现始终更好。但是,在函数中只使用 return 或 label/break(函数 r2() 和 b2())时,label/break 的表现更快。测试结果如下:
测试 1,使用 10000000 次迭代
使用 return 跳出嵌套循环的 3 次运行后的平均运行时间(毫秒):1215ms
使用 label/break 跳出嵌套循环的 3 次运行后的平均运行时间(毫秒):1522ms
测试 2,使用 1000000000 次迭代 // 迭代次数增加了两个数量级
使用 return 的 3 次运行后的平均运行时间(毫秒):1879ms
使用 label/break 的 3 次运行后的平均运行时间(毫秒):1862ms
因此:
对于跳出嵌套循环,使用 return 约快 25%
对于科学计算/HPC,使用 label/break 约快 1%