Java中if / else与switch语句的相对性能差异是什么?

问题

担心我的网络应用程序的性能,我想知道哪些"if / else"或switch语句在性能方面更好?


#1 热门回答(101 赞)

这是微观优化和过早优化,这是邪恶的。而是担心有问题的代码的可读性和可维护性。如果有超过两个if/else块粘在一起或其大小不可预测,那么你可能会高度考虑aswitch声明。

或者,你也可以抓取多态性。首先创建一些界面:

public interface Action { 
    void execute(String input);
}

并获得someMap中的所有实现。你可以静态或动态地执行此操作:

Map<String, Action> actions = new HashMap<String, Action>();

最后用这样的东西替换了if/elseswitch(将无效的检查放在一边):

actions.get(name).execute(input);

它可能比if/elseswitch要小,但代码至少可以更好地维护。

当你谈论Web应用程序时,你可以使用HttpServletRequest#getPathInfo()as操作键(最终编写一些代码以在循环中将pathinfo的最后部分分开,直到找到操作)。你可以在这里找到类似的答案:

  • 使用面向Servlet的自定义框架,太多的servlet,这是一个问题
  • Java前端控制器

如果你一般担心Java EE Web应用程序的性能,那么你也可以找到2669866590。除了(微)优化原始Java代码之外,还有其他领域给予****性能增益。


#2 热门回答(98 赞)

我完全同意过早优化是需要避免的。

但是,Java VM确实具有可用于switch()的特殊字节码。

SeeWM Spec(lookupswitchandtableswitch)

因此,如果代码是性能CPU图的一部分,那么可能会有一些性能提升。


#3 热门回答(47 赞)

if / else或switch不太可能成为你性能问题的根源。如果你遇到性能问题,应首先进行性能分析分析,以确定慢点的位置。过早优化是万恶之源!

尽管如此,可以通过Java编译器优化来讨论switch与if / else的相对性能。首先请注意,在Java中,switch语句在非常有限的域上运行 - 整数。通常,你可以按如下方式查看switch语句:

switch (<condition>) {
   case c_0: ...
   case c_1: ...
   ...
   case c_n: ...
   default: ...
}

wherec_0,c_1,...,和c_N是作为switch语句目标的整数,而<condition>必须解析为整数表达式。

  • 如果这个集合是"密集的" - 即(max(ci)1 - min(ci))/ n>α,其中0 <k <α<1,其中k大于某个经验值,跳跃可以生成表,这是非常高效的。
  • 如果此集合不是非常密集,但是n> =β,则二叉搜索树可以在O(2 * log(n))中找到目标,这仍然是有效的。

对于所有其他情况,switch语句与等效的if / else语句系列完全一样有效。 α和β的精确值取决于许多因素,并由编译器的代码优化模块确定。

最后,当然,如果<condition>的域不是整数,则switch语句完全没用。