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

Java 这是一个准确的性能测试吗?,java,performance,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语句的执行速度是否比条件语句快。唯一的问题是这是计时数量,而不是实际更快的性能。我可以做些什么来测试性能,而不是简单的数量竞争测试

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");
    }
}
类语句{
公共静态void main(字符串参数[]){
int x=0,y=0,x1=0,y1=0;
double startTime=System.currentTimeMillis();
做{
开关(x){
案例1:
x--;
y++;
打破
违约:
x++;
打破
}
}而(y<100000000);/5.718,6.736,6.124
double-endTime=System.currentTimeMillis();
System.out.println((endTime-startTime)/1000+秒);
double startTime1=System.currentTimeMillis();
做{
if(x1<1){
y1++;
x1++;
}否则{
x1--;
}
}而(y1<100000000);
double-endTime1=System.currentTimeMillis();
System.out.println((endTime1-startTime1)/1000+“秒”);
}
}

不,不是。在微基准测试中,特别是在Java中,可能会有很多很多错误


进入最重要的一点。

我建议您在发现实际的性能瓶颈之前不要担心它。过早优化是万恶之源,保持代码干净、可读性和可维护性,这样当瓶颈出现时,您就可以专注于实际瓶颈。

实际上,我要做的第一件事是检查生成的汇编代码(或者,在您的情况下,Java字节代码)

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


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

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

我会惊讶地发现:

  • 找出代码中的显著差异
  • 发现性能上的显著差异

  • 将向您显示字节码。

    您正在测量性能,由每种情况下每秒的循环数定义。如果你想看看什么是“更快”,我很难想出一个不同的测试来运行


    (您可能还希望在编译器的优化器打开和关闭的情况下,或者在不同的级别上尝试此测试。这是它可能变得有趣的地方。)

    如何读取汇编代码?还有一个用于java代码的gcc编译器?我以为这只是为了哈哈。我需要找出如何使用优化级别。实际上有一个名为gcj的gcc java编译器,但我考虑的更多是一般的分析思路:检查本机编译器的程序集(例如使用gcc-S),检查java类文件中的字节码(使用javap)诸如此类。为此,我将尝试启用优化器并查看更多:)如何查看汇编代码?如果有差异,我想看看。重要的信息不是我的,我只是指给你看;-)不客气。