我正在尝试测试switch语句是否比条件语句执行得更快。唯一的问题是时间数量而不是实际更快的性能。我可以做些什么来测试性能而不是简单的数量竞赛测试?
class Statements {
public static void main(String args[]) {
int x = 0, y = 0, x1 = 0, y1 = 0;
double startTime = System.currentTimeMillis();
do {
switch (x) {
case 1:
x--;
y++;
break;
default:
x++;
break;
}
} while (y < 1000000000); //5.718, 6.736, 6.124
double endTime = System.currentTimeMillis();
System.out.println((endTime - startTime) / 1000 + " seconds");
double startTime1 = System.currentTimeMillis();
do {
if (x1 < 1) {
y1++;
x1++;
} else {
x1--;
}
} while (y1 < 1000000000);
double endTime1 = System.currentTimeMillis();
System.out.println((endTime1 - startTime1) / 1000 + " seconds");
}
}
答案 0 :(得分:6)
不,不是。微基准测试可以做很多很多事情,特别是在Java中。
This Stackoverflow question进入最重要的一点。
答案 1 :(得分:3)
实际上,我要做的第一个事情就是检查生成的汇编代码(或者,在你的例子中,是Java字节代码)。
您可能会发现在这两种情况下都会生成相同的代码。编译器比以前更加智能,像gcc
之类的东西,我喜欢称之为“疯狂的优化级别”仍然会产生令我震惊的代码。
有一些很多可以影响经验测量,不会影响生成代码的静态分析。至少,您应该使用统计方法来最小化这些变化的影响。
答案 2 :(得分:3)
如果您真的对这些紧密循环的性能感兴趣,那么您是否尝试查看生成的.class文件并检查JVM字节码以指示它们之间的差异?
我会感到惊讶:
javap会显示字节码。
答案 3 :(得分:2)
我建议你不要担心它,直到你知道你有一个实际的性能瓶颈。过早优化是所有邪恶的根源,通过保持代码的清洁,可读性和可维护性,您可以更好地使用,这样您就可以专注于实际出现的瓶颈。
答案 4 :(得分:0)
您正在测量性能,由每个案例的循环次数/秒定义。如果你想看看什么是“更快”,我很难想到要运行的不同测试。
(您可能还希望在编译器的优化器开启或关闭时,或在不同的级别上尝试此测试。这就是它可以变得有趣的地方。)