这是一个准确的性能测试吗?

时间:2011-02-01 08:14:09

标签: java performance

我正在尝试测试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");
    }
}

5 个答案:

答案 0 :(得分:6)

不,不是。微基准测试可以做很多很多事情,特别是在Java中。

This Stackoverflow question进入最重要的一点。

答案 1 :(得分:3)

实际上,我要做的第一个事情就是检查生成的汇编代码(或者,在你的例子中,是Java字节代码)。

您可能会发现在这两种情况下都会生成相同的代码。编译器比以前更加智能,像gcc之类的东西,我喜欢称之为“疯狂的优化级别”仍然会产生令我震惊的代码。

有一些很多可以影响经验测量,不会影响生成代码的静态分析。至少,您应该使用统计方法来最小化这些变化的影响。

答案 2 :(得分:3)

如果您真的对这些紧密循环的性能感兴趣,那么您是否尝试查看生成的.class文件并检查JVM字节码以指示它们之间的差异?

我会感到惊讶:

  1. 找到代码中的重大差异
  2. 发现性能存在显着差异
  3. javap会显示字节码。

答案 3 :(得分:2)

我建议你不要担心它,直到你知道你有一个实际的性能瓶颈。过早优化是所有邪恶的根源,通过保持代码的清洁,可读性和可维护性,您可以更好地使用,这样您就可以专注于实际出现的瓶颈。

答案 4 :(得分:0)

您正在测量性能,由每个案例的循环次数/秒定义。如果你想看看什么是“更快”,我很难想到要运行的不同测试。

(您可能还希望在编译器的优化器开启或关闭时,或在不同的级别上尝试此测试。这就是它可以变得有趣的地方。)