我正在使用 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/

10-12 04:31