效率:切换if语句的语句 [英] Efficiency: switch statements over if statements
问题描述
PMD
告诉我
少于3个分支的交换机效率低,使用if语句
代替。
A switch with less than 3 branches is inefficient, use a if statement instead.
为什么?为什么3?他们如何定义效率?
Why is that? Why 3? How do they define efficiency?
推荐答案
因为编译了开关
语句有两个特殊的JVM指令, lookupswitch
和 tableswitch
。它们在处理大量案例时非常有用,但是当你只有几个分支时它们会产生开销。
Because a switch
statement is compiled with two special JVM instructions that are lookupswitch
and tableswitch
. They are useful when working with a lot of cases but they cause an overhead when you have just few branches.
if / else
语句被编译成典型的 je
jne
...链更快但需要更多的比较当在一长串分支中使用时。
An if/else
statement instead is compiled into typical je
jne
... chains which are faster but require many more comparisons when used in a long chain of branches.
你可以通过查看字节代码来看到差异,无论如何我不会担心这些问题,如果有的话可以成为一个问题然后JIT会照顾它。
You can see the difference by looking at byte code, in any case I wouldn't worry about these issues, if anything could become a problem then JIT will take care of it.
实际例子:
switch (i)
{
case 1: return "Foo";
case 2: return "Baz";
case 3: return "Bar";
default: return null;
}
编译成:
L0
LINENUMBER 21 L0
ILOAD 1
TABLESWITCH
1: L1
2: L2
3: L3
default: L4
L1
LINENUMBER 23 L1
FRAME SAME
LDC "Foo"
ARETURN
L2
LINENUMBER 24 L2
FRAME SAME
LDC "Baz"
ARETURN
L3
LINENUMBER 25 L3
FRAME SAME
LDC "Bar"
ARETURN
L4
LINENUMBER 26 L4
FRAME SAME
ACONST_NULL
ARETURN
虽然
if (i == 1)
return "Foo";
else if (i == 2)
return "Baz";
else if (i == 3)
return "Bar";
else
return null;
汇编成
L0
LINENUMBER 21 L0
ILOAD 1
ICONST_1
IF_ICMPNE L1
L2
LINENUMBER 22 L2
LDC "Foo"
ARETURN
L1
LINENUMBER 23 L1
FRAME SAME
ILOAD 1
ICONST_2
IF_ICMPNE L3
L4
LINENUMBER 24 L4
LDC "Baz"
ARETURN
L3
LINENUMBER 25 L3
FRAME SAME
ILOAD 1
ICONST_3
IF_ICMPNE L5
L6
LINENUMBER 26 L6
LDC "Bar"
ARETURN
L5
LINENUMBER 28 L5
FRAME SAME
ACONST_NULL
ARETURN
这篇关于效率:切换if语句的语句的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!