簡體   English   中英

Java在創建對象時的表現

[英]Java performance in creating objects

我正在努力提高我在Java性能優化方面的知識,並嘗試了多種方法來創建對象。
我遇到過這種行為,我對類中最終成員的使用並不熟悉:如果成員不是最終成員,則創建對象的成本要低得多(就時間而言)。 它是正確的還是我的代碼中有一些錯誤?

沒有最終成員的對象:

public class ComplexNumber {
    private double re, im;

    public ComplexNumber(double _re, double _im) {
        re = _re;
        im = _im;
    }

    public void setRe (double _re) {
        re = _re;
    }

    public void setIm (double _im) {
        im = _im;
    }

    @Override
    public String toString() {
        return re + " + i" + im;
    }

    @Override
    public int hashCode() {
        return 47 + 31*(int)re + 31*(int)im;
    }
}  

最終成員的對象:

public class FinalComplexNumber {
    private final double re, im;

    public FinalComplexNumber(double _re, double _im) {
        re = _re;
        im = _im;
    }

    @Override
    public String toString() {
        return re + " + i" + im;
    }

    @Override
    public int hashCode() {
        return 47 + 31*(int)re + 31*(int)im;
    }
}  

主要課程

public class PerformanceTest {

    private static final long ITERATIONS = 100000000l;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {


        ComplexNumber nr = new ComplexNumber(0, 0);
        System.out.println(nr);

        long time = System.currentTimeMillis();
        for (int i = 0; i < ITERATIONS; i++) {
            ComplexNumber num = new ComplexNumber(i, i);
        }
        System.out.println(System.currentTimeMillis() - time);

        time = System.currentTimeMillis();
        for (int i = 0; i < ITERATIONS; i++) {
            nr.setIm(i);
            nr.setRe(i);
        }
        System.out.println(System.currentTimeMillis() - time);

        time = System.currentTimeMillis();
        for (int i = 0; i < ITERATIONS; i++) {
            FinalComplexNumber num = new FinalComplexNumber(i, i);
        }
        System.out.println(System.currentTimeMillis() - time);
    }
}  

結果:

run:
0.0 + i0.0
953
219
7875
BUILD SUCCESSFUL (total time: 9 seconds)

如果成員不是最終成員,那么創建對象的成本要低得多(就時間而言)。

不,絕對不是這樣。 基本上,您的基准測試方法被打破了:

  • 您正在使用System.currentTimeMillis() ,這通常是基准測試的一個壞主意; System.nanoTime()是測量經過時間的首選
  • 你沒有提供任何JIT熱身
  • 您沒有使用您創建的對象,這可能允許在更常規的代碼中無效的JIT優化
  • 你甚至都沒有嘗試在內存垃圾方面開始一個關卡的游戲領域,所以你可能會發現你的第一個循環不需要執行任何垃圾收集,但你的上一個循環確實如此。

您可能希望查看一個旨在避免此類問題的微基准測試框架,如CaliperJMH

以下是您如何研究增加決賽對績效的影響: http//shipilev.net/blog/2014/all-fields-are-final/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM