Java switch语句默认放置的效率

Java switch语句默认放置的效率,java,switch-statement,Java,Switch Statement,默认语句的放置是否会影响Java中的效率?以下两者之间是否有区别: switch (a) { case 0: return 0; case 1: default: return -1; case 2: return 2 ... case 99: return 99; } vs 即使在最幼稚的实现中,这也不会产生性能上的差异,但对于Java,您与实际机器代码的距离太远,这将导致您绝对不应该尝试优化此代码或任何其他类似的代码。事实上,即使您编写了最愚蠢的级联,否则如果s,您仍然有很好的机会将其转换

默认语句的放置是否会影响Java中的效率?以下两者之间是否有区别:

switch (a) {
case 0: return 0;
case 1: default: return -1;
case 2: return 2
...
case 99: return 99;
}
vs



即使在最幼稚的实现中,这也不会产生性能上的差异,但对于Java,您与实际机器代码的距离太远,这将导致您绝对不应该尝试优化此代码或任何其他类似的代码。事实上,即使您编写了最愚蠢的
级联,否则如果
s,您仍然有很好的机会将其转换为基于超高速哈希查找的机器代码。

即使在最简单的实现中,这也不会产生性能上的差异,但是对于Java,您与实际机器代码的距离太远了,这将变成您绝对不应该尝试优化此代码或任何其他类似的代码。事实上,即使您编写了最愚蠢的
级联,否则如果
s,您仍然有很好的机会将其转化为基于超高速哈希查找的机器代码。

如果您编写了一个快速测试程序,我相信您不会看到任何显著的性能改进。至少没有一个可以证明隐藏代码是正确的。我只是将默认的大小写整齐地放在列表的最后,以使代码更具可读性。这可能比性能的微小改进(如果有的话)更重要。

我不相信如果你编写了一个快速测试程序,你会看到任何显著的性能改进。至少没有一个可以证明隐藏代码是正确的。我只是将默认的大小写整齐地放在列表的最后,以使代码更具可读性。这可能比性能的微小改进(如果有的话)更重要。

不,这不会有什么不同。为什么?因此:JVM何时知道必须使用
default
主体?在检查了所有其他病例之后。因此,将
default:
放置在中的特定位置不会改变性能。

不,这不会产生任何影响。为什么?因此:JVM何时知道必须使用
default
主体?在检查了所有其他病例之后。因此,将
默认值:
放置在不会改变性能的中的特定位置。

否。switch语句的位置与生成的字节码(调试注释除外)没有区别。

否。switch语句的位置与生成的字节码(调试注释除外)没有区别注释。

在开始优化之前,请使用探查器获取要分析的零件的数量。在开始优化之前,请使用探查器获取要分析的零件的数量。请注意,如果从第一个示例中删除了
case:1
,则相应的情况可能会变慢。@JanDvorak您是如何理解的?没有
case1
你只需要一个普通的
default
子句。
default
的位置不相关,语义相同,字节码也可能相同。没有大小写:1您可以快速找到正确的大小写,因为您不必遍历所有大小写。这在Java中可能并不重要(如果它使用哈希表),但在Java中肯定很重要。@JanDvorak即使在字节码级别也有直接查找指令,因此肯定不会涉及循环。优化的
开关
与表达式的静态类型密切相关,因此JavaScript除了保留语义外,并没有更好的表现,反而会破坏性能。不过,有点忽略了构造的要点。我想这可能会对动态切换语句的Javascript性能产生负面影响。请注意,如果从第一个示例中删除了
case:1
,则相应的case可能会变慢。@JanDvorak您如何理解?没有
case1
你只需要一个普通的
default
子句。
default
的位置不相关,语义相同,字节码也可能相同。没有大小写:1您可以快速找到正确的大小写,因为您不必遍历所有大小写。这在Java中可能并不重要(如果它使用哈希表),但在Java中肯定很重要。@JanDvorak即使在字节码级别也有直接查找指令,因此肯定不会涉及循环。优化的
开关
与表达式的静态类型密切相关,因此JavaScript除了保留语义外,并没有更好的表现,反而会破坏性能。不过,这有点忽略了构造的要点。我想这有点暴露了动态切换语句的Javascript性能。这不太正确。我刚刚编译了这两个版本,我的编译器为这两个版本生成了不同的字节码。当然,区别很小。@NPE区别是什么?只是一个不同的跳转目标和重复的代码?@JanDvorak:没错。请注意,我并不是说这具有任何实际重要性不完全是这样。我刚刚编译了这两个版本,我的编译器为这两个版本生成了不同的字节码。当然,区别很小。@NPE区别是什么?只是一个不同的跳转目标和重复的代码?@JanDvorak:没错。请注意,我并不是说这具有任何实际重要性
switch (a) {
case 0: return 0;
case 1: return -1;
case 2: return 2;
...
case 99: return 99;
default: return -1;
}