我正在做这样的事情:
第一种情况:
for(int i=0; i<50; i++){
// execute some other code here
switch(myCustomInt){
case 1:
case 2:
case 3:
// execude method1
break;
case 4:
// execute method2
break;
}
}
第二种情况:
for(int i=0; i<50; i++){
// execute some other code here
}
switch(myCustomInt){
case 1:
case 2:
case 3:
for(int i=0; i<50; i++){
// execute method1
}
break;
case 4:
for(int i=0; i<50; i++){
// execute method2
}
break;
}
问题:
第一个场景只运行一次for循环,但检查switch语句50次。
第二个场景运行for循环两次,但只检查一次switch语句。
哪种更好的执行方式?我知道在今天的技术中,差异很可能是微不足道的。但我仍然很好奇理论上哪一个更好的执行方式呢?
谢谢!
答案 0 :(得分:1)
请注意,当 method1
和method2
相对于“其他代码”调用(例如)i == 42
时,存在语义差异在for
循环中:首先,method1
/ method2
在“其他代码”之前为i == 42
次迭代调用所有完成i == 43
到i == 49
次迭代。在第二个中,50个循环迭代的所有“其他代码”在第一次调用method1
或method2
之前完成。
除了语义差异外,它确实无关紧要。做最可读和可维护的事情。这可能意味着第一个,但“可读和可维护”的内容因人而异。 Elliott's point第二个重复循环标题另外两次是很好的:它打开了通过更改三个中的一个而不是另外两个中的一个或两个而导致的错误的大门。
表现:这没关系。第一个要求switch (myCustomInt)
的评估比第二个高49倍。从理论上讲,评估需要时间。在实践中,我敢打赌你真的非常非常难以衡量差异,特别是如果HotSpot(Oracle Java运行时)决定这是一个热点并积极地优化它。