case-statement or if-statement efficiency perspective [duplicate]

心已入冬 提交于 2019-12-17 20:17:51

问题


Possible Duplicates:
Is "else if" faster than "switch() case"?
What is the relative performance difference of if/else versus switch statement in Java?

I know that case statements can be implemented with jump tables. Does this make them more efficient than if statements?

Is this just micro-optimization that should be avoided?


回答1:


I think the main thing is to write the code as clearly as possible. Micro-optimizations like this shouldn't be the focus.

For example, if you have something like this:

if (age == 10) {
  // ...   
} else if (age == 20) {
  // ...   
} else if (age == 30) {
  // ...   
} else if (age == 40) {
  // ...   
}

Then it's clearer to use a switch statement:

switch (age) {
    case 10:
        // ...
        break;
    case 20:
        // ...
        break;
    case 30:
        // ...
        break;
    case 40:
        // ...
        break;
}

Again, I would focus on making the code easiest to read and maintain rather than nano-second level efficiency gains.




回答2:


Any compiler will make the jump table if it can verify that the values are reasonably compact. (I doubt if they are in this case, being multiples of 10.)

This is a micro-optimization. Micro-optimization makes sense only if you know that it does. Typically, there are larger "fish to fry" elsewhere, in the form of function calls that could be done without. However, if you have already tuned the daylights out of this code, and your profiling shows that a good fraction (like 10% or more) of time is going into these IF statements (and not to their contents) then it helps. This can happen, for example, in a byte-code interpreter.

Added: Another reason I like to use switch is, even if it doesn't make a jump table - when stepping through the code in a debugger, it goes directly to the proper case, rather than making me step through a lot of false if statements. Makes it easier to debug.




回答3:


If you had a very large chain of if else statements, then, yes, you might feel the difference. But it is very unrealistic that you'll ever write such a long ifelse chain. And if even you did, it's still very unlikely that that is where your performance bottleneck would be.

Write your code to be readable first, and let yourself be guided by a profiler when the need for performance optimization arises.




回答4:


Probably is doen't matter. Bytecode is just a "transport format" to the JVM. What happens insite the JVM is very different from the bytecode representation. (Example: Bytecode doesn't offer float operations, so float +-*/% float is done as double operations and then the result is casted back to float. Same is true for byte/short, they are converted to int and then back.) But for switch they are two bytecode formats, one already with a jump table. But honestly: I would choose a format which is best for you and the reader of your program. The JVM will do the rest. If you are too smart you JVM maybe don't get your point and in the end the program is slower.

"We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil" D. Knuth




回答5:


  1. Yes
  2. No, it is part of your program design. But you should consider whether an over-ridable method mightn't be an even better solution, with a family of types.


来源:https://stackoverflow.com/questions/3387758/case-statement-or-if-statement-efficiency-perspective

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!