我正在使用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;
}
}
}
}
我知道除了在满足内心条件/完成作业后完成功能,我什么都不做。
谢谢!
答案 0 :(得分:6)
经过一些测试(通过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())的突破时,返回一致地表现得更好。但是,当在函数中使用return或label / break(函数r2()和b2())时,标签/ break的执行速度要快得多。测试结果细分:
测试1,使用10000000次迭代
使用return返回离开嵌套循环3次后的平均运行时间(毫秒):1215ms
使用label / break运行3次以保留嵌套循环后的平均运行时间(毫秒):1522ms
测试2,使用1000000000次迭代 //多次迭代2个数量级
使用return返回3次后的平均运行时间(毫秒):1879ms
使用label / break 3次运行后的平均运行时间(毫秒):1862ms
<强>因此:强>
对于破坏嵌套循环,使用 return 快〜25%
对于science / HPC,使用 label / break 快〜1%
答案 1 :(得分:0)
我个人认为空返回语句没有任何问题,以便在没有正常返回任何内容的函数的早期中止执行。它肯定比标签更清晰,而且它也更加语言无关。许多语言不支持标记for循环,就像你的示例所使用的语言一样,因此对于来自缺少该功能的其他语言的人来说,返回空语句会更容易理解。
答案 2 :(得分:0)
更新:
这里的好消息:Why JavaScript functions always return a value?,第一个回答是:&#39;因此,返回和功能执行到它的结束语义匹配。&#39;因此,即使您使用break,在执行结束时它将返回与使用return
相同的结果答案 3 :(得分:0)
两者具有相同的性能;前者可以说更具可读性。 但是,如果您需要在循环之后添加更多指令,后者可以更容易地修改函数。