2013-12-10 70 views
-4

我剛剛意識到,當我在Java中AM程序我避免局部變量瘟疫一樣,如果我真的有我前面加上一個小寫的「L」的成員,並有重置該對象的方法(如果對象是我的,我通常有一種叫做init的私有方法,或者構造函數調用的東西)我有條件避免局部變量 - 我做對了嗎?

我剛剛意識到這在很多方面都很難看。我做對了嗎?

C++程序員正是我的意思,當地人不離開此功能的範圍被自動銷燬對我們(如果它離開了功能範圍,使用指針,等等等等等等)

模式知道對於出現這種情況時

我發現每當我適合適配器的功能參數與它互動通過此適配器是當我用這個。

我也傾向於有機會上適配器保持它使用(達到一定的數量)

它也會發生時,我想使用需要「新」來初始化,但只在數據類型的任何對象池方法。

的代碼是一些主循環通常的一部分,否則它不會有問題,很明顯(這不是一次性的東西)

GC Collection amount: 
Amount (Mb): | 30| 60| 90| 120| 150| 180| 210| 240| 270| 300| 330| 360| 
--------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ 
With pattern |## (14) 
without  |################################################################### (350) 

該計劃通過其子公司推測試平均值顯示GC數量。兩者的標準偏差小於5。

這感覺就像它在某種程度上關係到飛輪模式...

有這個,因爲沒有代碼:

它可以表現在許多方面!如果你有一個ComplexNumber類例如,如果你只是創建它們可以在需要時將產生大量的垃圾,如果您有任何形式的vectormatrix類,同樣的事情。

的另一個領域是涉及某種形式的圖表中的哪一個認真走過來產生另一種結構,就像一個場景圖,關鍵路徑,甚至代表當前目錄棧東西。

基本上,如果你有「新」分配到一個局部變量在被調用了很多,你會發現這個方法。上述

它來自一個節目,我寫信給教導有限狀態自動機和其他狀態機的人使用

樣品(Markov鏈,等等),我注意到了沉重的RAM使用,並決定進行調查。

與其他語言

比較顯然C++不存在這個問題。但你也不會很高興知道Python。Python的引用計數方法(假設你沒有任何cricles)在方法結束的時候被刪除,事實上它有一個元方法,你可以可靠地用它作爲析構函數(假如你有足夠的紀律處理,泄漏它的方法)

我不能第一個有這個問題,看着類似的問題暗示有沒有解決方案,但我不能相信,這是以前沒有遇到!

關於我

我在C來++和Python(他們兩個!愛)到Java,我在java中說,「經歷了」我可以讀/寫東西的作品,它遵循不錯的設計理念等等,但我傾向於非常注意性能和資源。我正在忍受const的退縮,我是一個總妓女。

這如何不集中

假設你有一個GroupElement類 - 表示代數羣中的一員,我們將使用的添加劑符號。

假設g.add(h)返回一個新的元素,如果你這樣做很多次你有很多元素。相反,如果你有:

GroupElement f = new GroupElement(0); //identity 
g.add(f,h); 

其中:

add的第一個參數是把結果的地方,我們產生無垃圾。

不遵循上述

你應該知道的複數就是誰的人?假設一個複數有一個稱爲add的方法,它需要一個複數並返回一個新的複數。如果你做了很多次,你會得到一個LOT減1的垃圾複數。

如果你有inplaceAdd(ComplexNumber target, ComplexNumber value)說其中:

target.real = value.real+real; 
target.im = value.im+im; 

如果你創建無垃圾:b.inplaceAdd(a,c) - 這不一樣的上述a=b.add(c)

BTW add可以這樣做:return new ComplexNumber(real+value.real,im+value.im) - 看什麼現在;立刻;馬上?

例如的執行情況(嚴重的傢伙,你怎麼不買這個吧!)

public class ComplexNumber { 
    private double real; 
    private double im; 

    public ComplexNumber(double r, double i) { 
     real = r; 
     im = i; 
    } 

    public ComplexNumber add(ComplexNumber value) { 
     return new ComplexNumber(real + value.real, im + value.im); 
    } 

    public void inplaceAdd(ComplexNumber target, ComplexNumber value) { 
     target.real = real + value.real; 
     target.im = im + value.im; 
    } 
} 
+1

我清除了所有註釋因爲他們正在失控。請@LuiggiMendoza停止美國化所有的拼寫。 – ChrisF

+1

@ChrisF *美國化:) –

+2

順便說一句,即使實際上有一個'void'返回三參數'add'(加數#1,加數#2,目的地)的真正原因,我認爲像'public void setToSumOf(final ComplexNumber ... numbers)'會更具可讀性。 – ruakh

回答

3

如果你有一個ComplexNumber類例如,如果你只是創建它們可以在需要時會產生龐大的垃圾量,如果你有任何種類的vectormatrix類,同樣的事情。

請記住,垃圾是免費的;垃圾收集的成本由確定 - 必須遍歷的垃圾。(我的意思是,VM規範並沒有真正指定GC是如何實現的,但這就是主要的工作方式。)這是有意爲之的:顯然沒有技術上的原因:Java實現不能使用使用引用-數數;這只是它不被認爲是非常強大/有效/可靠/等。 (在C++和Perl以及Python中,引用計數爲您提供了可預測的析構函數的優勢,Java不提供這種功能;相反,它提供finally塊和try隨資源。)

+0

查看我的帖子底部的編輯,它解釋了我的意思。 –

+2

@AlecTeal:對不起,我不是很瞭解你的編輯 - 看起來你剛剛將'new'從一段代碼移到另一段,而實際上並未影響分配的數量 - 但無論如何,答案是一樣的。沒有理由重用對象,因爲短命的對象並不昂貴。 – ruakh

+0

根據參數是什麼類型,你不是在做你認爲你正在使用的代碼。 –