我正在研究一些需要高度优化的Java代码,因为它将在我的主程序逻辑中的许多点调用的热函数中运行.此代码的一部分涉及将double变量乘以10凸起到任意非负int exponents.一个快速的方式(编辑:但不是最快的,见下面的更新2)获得相乘的值是switch在exponent:
double multiplyByPowerOfTen(final double d, final int exponent) {
switch (exponent) {
case 0:
return d;
case 1:
return d*10;
case 2:
return d*100;
// ... same pattern
case 9:
return d*1000000000;
case 10:
return d*10000000000L;
// ... same pattern with long literals
case 18:
return d*1000000000000000000L;
default:
throw new ParseException("Unhandled power of ten " + power, 0);
}
}
Run Code Online (Sandbox Code Playgroud)
上面注释的省略号表示case int常量继续递增1,因此case上面的代码片段中确实有19 秒.因为我不知道我是否真的需要10一切权力,并case声明 …
java compiler-construction performance assembly switch-statement
Java编译器通常使用String对象生成比使用链式if-then-else语句更高效的字节码.
AFAIK even String in switch在.equals()内部以区分大小写的方式使用.那么它们在这种背景下的效率是多少.编译速度更快?字节码少?更好的性能?
Java的switch语句如何在幕后工作?它如何比较正在使用的变量的值与案例部分中给出的值?它是否使用==或.equals(),或者完全是其他东西?
我主要对前1.7版本感兴趣.
我目前正在使用switch语句来处理有大约20种不同情况的传入消息类型.其中一些案例比其他案件更有可能发生数量级.
热点编译器是否能够优化检查案例的顺序以找到要执行的正确案例,或者我应该构建我的代码以便最常见的案例首先出现:
switch(messageType)
{
case MOST_COMMON:
// handle it
break;
...
case LEAST_COMMON:
// handle it
break;
}
Run Code Online (Sandbox Code Playgroud)
所有案件都是互相排斥的.
我会更好地使用策略模式和消息类型的Map查找吗?
性能是关键问题,因为我每秒处理数千条消息,并且正在尝试减少对象创建和方法调用开销.
非常感谢,
克里斯
编辑:感谢指点.messageType是一个具有较小值范围的int,因此看起来它将编译为"tableswitch"字节码,因此无需重新排序.
JVM规范的相关部分在这里http://java.sun.com/docs/books/jvms/second_edition/html/Compiling.doc.html#14942
我想做这样的事情:
int i = 0;
switch(difficulty) {
case 1: i++; break;
case 2: i--; break;
default: case 1;
}
Run Code Online (Sandbox Code Playgroud)
这样的事情可能吗?我想防止重复的代码.我知道在这个特定的例子中没有理由这样做,因为重复的代码会很小.我能想出的唯一一件事是[使用开关盒的能力下降]:
switch(difficulty) {
case 2: i--; break;
default:
case 1: i++; break;
}
Run Code Online (Sandbox Code Playgroud)
我宁愿不这样做,因为增加案例数量并在底部有默认值会更有意义.
但是我想知道,如果我这样做,它会搞砸引擎盖下的goto语句吗?特别是,不需要更长的时间来决定使用哪个goto语句,因为数字或乱序?订单在switch语句中是否重要?想象一下,所有案例都有相同的被调用几率,如果你以随机顺序而不是线性顺序将它们放在一起会有意义吗?
[编辑:对于我关于效率的问题,我发现:交换语句的顺序是否重要,简短的答案是否:交换机案例顺序是否会影响速度? Java的交换机是如何工作的?