当前位置: 首页 > 面试题库 >

效率:将语句切换到if语句

慕河
2023-03-14
问题内容

PMD 告诉我

少于3个分支的交换机效率低下,请改用if语句。

这是为什么?为什么是3?他们如何定义效率?


问题答案:

因为switch语句是使用两个特殊的JVM指令lookupswitch和编译的tableswitch。在处理很多案例时它们很有用,但是当您只有很少的分支机构时,它们会导致开销。

if/else相反,一条语句被编译为典型的je jne…链,这些链速度更快,但在长分支链中使用时需要更多的比较。

您可以通过查看字节码来看到差异,无论如何我都不担心这些问题,如果有什么可能成为问题,那么JIT会解决它。

实际示例:

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…else像这样: 但是我需要添加更多的语句,所以我认为使用switch…case更好,所以我尝试这样做: 但没有奏效。我错过了什么?

  • 问题内容: 是否有热键或简便的方法用IntelliJ中的开关替换if-else if语句?我不希望不将if-else if语句手动转换为开关。我希望能够突出显示if- else if语句并按组合键或使用菜单按钮。 问题答案: 更新 :正如@christopheml在对另一个答案的评论中指出的那样,“用Switch替换”似乎在IntelliJ 2018.1中消失了。已在此处提交错误。 有Intell

  •  if 语句,就是类似于「如果○○的话,做●●」,根据条件判断脚本的一部分是否执行的语法。  语法如下: if(expression) 语句或语句块 else 语句或语句块  第一个“语句或语句块”是当 expression 表达式的结果为真时执行的部分,第二个“语句或语句块”则是结果为假时执行的部分。如果不需要 else 以后的部分,可以省略。 例: if(a==b) inform("a和b相等

  • 问题内容: 我刚刚开始做我的第一个项目(很有趣)。我正在学习PHP和MySQL,并且已经完成了我的第一个正常工作的应用程序。它可以工作,但是我现在正在学习如何保护应用程序的安全,从而防止SQL注入。我大约有50多个PHP文件来管理与MySQL数据库的交互。它们看起来都是这样的: 这是我在整个应用程序中用于向数据库读写数据的格式。如果我需要将它们更改为准备好的语句,而不是在其中插入任何信息,而只是在

  • 我有一个if else语句,它可能会在不久的将来增长。 因为,这看起来已经很乱了,我想如果我能在这里应用任何设计模式会更好。我研究了战略模式,但我不确定这是否会降低其他条件。有什么建议吗?

  • Go 语言条件语句 if 语句由布尔表达式后紧跟一个或多个语句组成。 语法 Go 编程语言中 if 语句的语法如下: if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } If 在布尔表达式为 true 时,其后紧跟的语句块执行,如果为 false 则不执行。 流程图如下:Go 语言条件语句