Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在许多情况下优化Java switch语句?_Java_Performance_Switch Statement - Fatal编程技术网

在许多情况下优化Java switch语句?

在许多情况下优化Java switch语句?,java,performance,switch-statement,Java,Performance,Switch Statement,我目前正在使用switch语句来处理传入消息的类型,其中有20种左右不同的情况。其中一些情况比其他情况更可能发生 hotspot编译器是否能够优化检查案例的顺序,以找到要执行的正确案例,或者我是否应该构建代码,以便最常见的案例首先出现: switch(messageType) { case MOST_COMMON: // handle it break; ... case LEAST_COMMON: // handle it

我目前正在使用switch语句来处理传入消息的类型,其中有20种左右不同的情况。其中一些情况比其他情况更可能发生

hotspot编译器是否能够优化检查案例的顺序,以找到要执行的正确案例,或者我是否应该构建代码,以便最常见的案例首先出现:

switch(messageType)
{
    case MOST_COMMON:
        // handle it
        break;

...
    case LEAST_COMMON:
        // handle it
        break;
}
所有情况都是相互排斥的

使用策略模式和消息类型的映射查找会更好吗

性能是关键问题,因为我每秒处理数千条消息,并试图减少对象创建和方法调用开销

非常感谢,

克里斯

编辑: 谢谢你的指点。 messageType是一个int,它的值范围很窄,因此看起来它将编译为“tableswitch”字节码,因此无需重新排序大小写


JVM规范的相关部分在这里

除非您确定这个switch语句导致了性能问题,否则我建议您过早地进行优化。另外,请查看。

如果案例是
enum
值或密集分布的
int
值,那么一旦JIT编译器开始将其全部转换为查找表,那么破坏顺序将不会有帮助


如果您使用的是Java7字符串开关或稀疏分布的值,那么最常见的应该首先使用,因为它会变成一组级联的
If
-类似于测试和分支操作。

switch语句是执行查找以确定跳转到哪个代码块的语句。它不是一系列if/else检查,并且块的声明顺序对性能没有影响。i、 e.所有案例值均应同时进行同等检查

与之相同的伪代码(对于较小的int值范围)

对于较大的int值范围,使用不同的表结构。(我假设它是一个哈希表)


C++可以使用分支预测,如果一个案例比其他的更常见,它可以动态地优化执行。Java也可以做同样的事情。但我可能错了。JIT的可能重复应该会在执行期间优化路径。我会对这两种机制进行分析,以确定它们的正确性。@Andythonas Cramer,除了这是开关vs地图。@Dave Newton-我正在查看这两个问题的内容。这个问题背后的前提是假设开关的实现就像if/else链一样。前面的问题解释了它们实际上是如何实现的。使用java7字符串开关,速度会慢一些,因为它会变成级联的“if”语句,它会在evelinging strings上使用“equals”。Mike,开关位于int上,值的范围很窄,所以我认为答案是查找表,不需要重新排序子句。@maks,我想我同意。你是想指出我的答案中有一部分是错误的,还是只是对字符串开关进行了一般性的评论?嗨,迈克,重点是:)这段代码在每个工作日处理数亿个事件,占程序CPU周期的30%左右。在深入研究JVM规范之前,我只是想了解一下JIT。

goto case_label[messageType.ordinal()];