【发布时间】:2012-12-30 06:32:53
【问题描述】:
我对@987654322@ 的速度很好奇,认为它“非常”快,但我有一个测试用例,似乎显示单个开关大约与大约 4 个if 测试一样快,当我预计(没有充分的理由)它会像 1 次测试一样快。这是我写的两个比较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() 的另一个相同循环
在我的机器上,这些循环需要大约在同一时间才能完成,这令人惊讶。
我得出的 if 数为“4”,因为这是给定输入范围的平均值(我认为)。
如果我减少逻辑选项的数量,if 版本会明显更快。
我的问题是:
switch 是不是真的没有那么快,或者这在某种程度上是一个“不公平”的测试?
【问题讨论】:
-
此链接可能会有所帮助-stackoverflow.com/questions/680656/…
-
JVM 的哪个版本?
-
你是如何测量时间的?您是否在 -server 模式下运行?你的测试很可能毫无意义。
-
这可能是不公平的。大部分 CPU 时间将用于处理模 (%),这会掩盖您在 switch 与 if() 中看到的任何差异。尝试改用 i % 8 ... JVM 可能会将其优化为相当于 i & ~7 的位掩码
-
我知道我的回答没有回答您的问题,但在您的情况下,您可以通过保存和数组 int 或(枚举)来优化您的代码(我看到您正在寻找优化性能),而数组的索引是键->您的函数将返回 arr[index]
标签: java performance if-statement switch-statement