加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java:枚举与if-then-else的性能

发布时间:2020-12-14 05:57:18 所属栏目:Java 来源:网络整理
导读:我没有真正的运气,通过使用Google来获得这个比较的简明回答,而不是自己耗时的评估,我以为我会先问. 我相当肯定,使用枚举的switch语句的执行速度要比if-then-else语句快,不过它是否是一个显着的区别是另一个问题. 有人可以为我说明一下吗? 感谢您快速回复的
我没有真正的运气,通过使用Google来获得这个比较的简明回答,而不是自己耗时的评估,我以为我会先问.

我相当肯定,使用枚举的switch语句的执行速度要比if-then-else语句快,不过它是否是一个显着的区别是另一个问题.

有人可以为我说明一下吗?

感谢您快速回复的人,我将会考虑到未来的项目.

解决方法

是的,因为一般来说,switch语句的工作速度比if / else链的速度要快.

虽然生成的字节码并不总是确定性能比较的来源,但您可以检查它是否有更好的想法.

例如这个代码:

class A { 
    enum N { ONE,TWO,THREE }
    void testSwitch( N e ) { 
        switch( e ) { 
            case ONE : x(); break;
            case TWO : x(); break;
            case THREE : x(); break;
        }
    }
    void testIf( Enum e ) { 
        if( e == N.ONE ) { x(); }
        else if( e == N.TWO ) { x(); }
        else if( e == N.THREE ) { x(); }
    }
    void x(){}
}

生成以下内容:

Compiled from "A.java"
class A extends java.lang.Object{
A();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

void testSwitch(A$N);
  Code:
   0:   getstatic   #2; //Field A$1.$SwitchMap$A$N:[I
   3:   aload_1
   4:   invokevirtual   #3; //Method A$N.ordinal:()I
   7:   iaload
   8:   tableswitch{ //1 to 3
        1: 36;
        2: 43;
        3: 50;
        default: 54 }
   36:  aload_0
   37:  invokevirtual   #4; //Method x:()V
   40:  goto    54
   43:  aload_0
   44:  invokevirtual   #4; //Method x:()V
   47:  goto    54
   50:  aload_0
   51:  invokevirtual   #4; //Method x:()V
   54:  return

void testIf(java.lang.Enum);
  Code:
   0:   aload_1
   1:   getstatic   #5; //Field A$N.ONE:LA$N;
   4:   if_acmpne   14
   7:   aload_0
   8:   invokevirtual   #4; //Method x:()V
   11:  goto    39
   14:  aload_1
   15:  getstatic   #6; //Field A$N.TWO:LA$N;
   18:  if_acmpne   28
   21:  aload_0
   22:  invokevirtual   #4; //Method x:()V
   25:  goto    39
   28:  aload_1
   29:  getstatic   #7; //Field A$N.THREE:LA$N;
   32:  if_acmpne   39
   35:  aload_0
   36:  invokevirtual   #4; //Method x:()V
   39:  return

void x();
  Code:
   0:   return

}

这两种情况似乎都相当快.

所以,选择一个更容易维护的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读