我对switch上的速度很好奇,认为它“非常”快,但我有一个测试用例,它似乎表明一个开关大约和4个if测试一样快,而我预计(没有确凿的理由)它会和一个测试一样快。下面是我为比较switch和if而编写的两种方法
public static int useSwitch(int i) {
switch (i) {
case 1: return 2;
case 2: return 3;
case 3: return 4;
case 4: return 5;
case 5: return 6;
case 6: return 7;
default: return 0;
}
}
public static int useIf(int i) {
if (i == 1) return 2;
if (i == 2) return 3;
if (i == 3) return 4;
if (i == 4) return 5;
if (i == 5) return 6;
if (i == 6) return 7;
return 0;
}这是我的测试代码:
long x = 0;
for (int i = 0; i < 999999; i++)
x += useIf(i % 7); // I use "x" so calls won't get optimized out和useSwitch()的另一个相同的循环
在我的机器上,这些循环几乎是同时完成的,这是一个惊喜。
我得出的ifs数为"4",因为这是给定输入范围的平均值(我认为)。
如果我减少逻辑选项的数量,那么if版本的速度明显更快。
我的问题是:
是switch实际上没有那么快,还是在某种程度上这是一个“不公平”的测试?
发布于 2012-12-30 11:49:20
由于您的代码可能会或可能不会根据JIT的智能程度而被消除,所以您可能已经确定if语句比开关更容易消除。这并不奇怪,因为很多语句更有可能被删除,例如断言和调试检查。
https://stackoverflow.com/questions/14088824
复制相似问题