java - 静态 block 与静态方法 - 初始化静态字段

标签 java static-methods static-members performance-testing

出于好奇,我测量了静态 block 和静态方法初始化程序之间的性能。首先,我在两个单独的 java 类中实现了上述方法,如下所示:

首先:

class Dummy {
    static java.util.List<Integer> lista = new java.util.ArrayList<Integer>();
    static {
        for(int i=0; i < 1000000; ++i) {
            lista.add(new Integer(i));
        }
    }
}

public class First {
    public static void main(String[] args) { 
        long st = System.currentTimeMillis();
            Dummy d = new Dummy();
        long end = System.currentTimeMillis() - st;
        System.out.println(end);    
    }
}

第二个:

class Muddy {
    static java.util.List<Integer> lista = new java.util.ArrayList<Integer>();
    public static void initList() {
        for(int i=0; i < 1000000; ++i) {
            lista.add(new Integer(i));
        }
    }
}

public class Second {
    public static void main(String[] args) { 
        long st = System.currentTimeMillis();
            Muddy.initList();
            Muddy m = new Muddy();
        long end = System.currentTimeMillis() - st;
        System.out.println(end);    
    }
}

然后我执行了this小批处理脚本来测量它 100 次并将值放入文件中。 batchFile.bat First Second dum.res.txt

在那之后,我写了this一段代码来计算 Dummy 和 Muddy 的测量值的平均值和标准差。

这是我得到的结果:

First size: 100 Second size: 100
First       Sum: 132    Std. deviation: 13
Second      Sum: 112    Std. deviation: 9

它在我的其他机器上也是类似的......每次我测试它。

现在我想知道,为什么会这样?我检查了字节码,Second.class 在调用 System.currentTimeMillis() 之间还有一条指令(调用静态 initList())。 他们都做同样的事情,但为什么第一个慢?我无法仅通过查看字节码来真正推断出它,因为这是我第一次接触 javap;我还不懂字节码。

最佳答案

我认为静态 block 版本比静态方法版本慢的原因可能是由于它们获得的不同 JIT 优化......

有关更多有趣信息,请参阅这篇有趣的文章:Java Secret: Are static blocks interpreted?

关于java - 静态 block 与静态方法 - 初始化静态字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8189473/

相关文章:

java - 为什么 Eclipse 建议我将我的方法设为静态

java - ReentrantLock 是否足够安全以保护对静态变量的多线程访问

Spring应用程序上下文: How do you set a constructor argument of a class to a class static member variable?

java - 此 sql 查询的 jpql 等效项(从国家字符查询)

java - 如何为本地服务器设置 AWS Lambda 服务

java - Maven:访问自签名存储库时出现 SunCertPathException

需要 C++ 静态方法

java - 为什么Java平台独立?

java - 无法对非静态方法进行静态引用

c++ - 全局变量在不同的静态方法中使用时会得到不同的值