2013-07-25 20 views
2

這是一個關於硬編碼數據效率的常見問題 - 我正在編寫一個用Java進行化學分析的程序,我需要使用不同元素的同位素丰度。我有它設置,現在的方式是,所有的值(這永遠都不需要進行修改)都存儲在我的級決賽場,即硬編碼值與文件讀數的比較

static final double C12Abundance = .989; 
static final double C12Mass = 12; 

很多類似的節目存儲這種類型的數據在XML文件,然後從那裏讀出的值,就像這樣:

<compounds> 
<elements> 
    <element symbol='C' mono_isotopic_mass ='12.00000000000' abundance='.989'/> 

是否有任何理由(性能,內存等),以這種方式閱讀?似乎更容易將它作爲一個字段。

+0

如果一個新的同行評審研究顯示C12多一點(或少一點)豐富會怎麼樣? – Ingo

+0

@Ingo大多數丰度非常明確,如果它確實發生了變化,那麼在特定的環境下(即不是一般的大氣條件),它的差異可能非常小。另外我只對五種不同的元素進行硬編碼,所以我總是可以回去更新它。 –

+1

只是說,沒有進攻。讓他們在一個文件中的另一個好理由是當你編寫你的下一個程序,並需要更多的元素。而下一個。等等。在這種情況下,如果你有這個數據庫和一個類在啓動時讀取它,你可以擴展它,而不會干擾較舊的程序或從它們複製代碼。 – Ingo

回答

2

就性能和內存分配而言,硬編碼的速度要快得多。

從閱讀文件中獲得的東西是代碼重用性(用不同參數運行程序而不需要重新編譯它)。

注意,從文件中讀取具有以下步驟:

  1. 聲明變量用來存儲一個值。
  2. 創建輸入(流)對象
  3. 與路徑
  4. 打開從FS
  5. 文件初始化它找到正確的路線從
  6. 讀取讀取值
  7. 存儲在變量上述
  8. 關閉輸入(流)

這是一個相當大的開銷,而不是一個公關電子編譯的最終變量,值爲

+3

如果在大型計算開始時只讀取一次該值,則好處不會很大。 – hivert

+0

感謝您的迴應 - 我將數據硬編碼。在這種特殊情況下,我無法想象一個場景,我不得不改變這些值(即使我可以編輯源文件並重新編譯) –

0

配置文件包含屬性,一般來說這些屬性會隨時間變化。我相信在你的情況下,這些是固定的,根據定義決不會改變。
因爲這個原因,我會盡可能地做更容易的事情,這就是讓他們成爲領域。

這不是一個性能問題,只要性能沒有出現問題,這只是一個更容易在代碼庫中使用的問題。

我建議你將這些值作爲常量提取出來,這樣你就可以隨時導入它來訪問這些值。

0

只能由Java編譯器讀取的Java代碼,而XML可以通過任何合理的(意思是XML感知的)語言來讀取。另外如果你想增加一些價值,你不必重新編譯一切。

0

就我個人而言,如果值不會改變,並且應用程序很小,我會選擇硬編碼。否則,我會選擇conf數據的外部來源。

但是每次人們都告訴我價值觀不會改變,這很大程度上意味着他們準備動態環境是一般的方式。 XML conf文件,數據庫配置表等。

1

如果您想對這些值進行硬編碼並想更改它們,則必須重新編譯程序,這就是問題所在。從文件中讀取數據具有以下好處:

  • 您不必等待程序重新編譯數據中的每個更改。對於一個相當大的程序,這可能需要時間。
  • 您的用戶無需訪問源即可更改數據。
  • 您可以通過更改配置文件名來切換不同的數據集。

也許這件事對你沒有任何意義;然後繼續並將您的數據放在源代碼中。

除了如果你的分析器這樣說,性能本身(如在程序的性能中)從來都不是問題。但我沒有看到在啓動時讀取數據文件的一小部分數據可能是一個漫長的過程,所以我相當肯定你不會看到差異。

0

如果您在XML寫他們,你可以爲不同的設備使用不同的值, 例如,假設你有名字item_margin一個維度,它需要根據設備的寬度是不同的,所以在values/dimens.xml你有這樣的

<dimen name="item_margin">0dp</dimen> 

和在具有分要該餘量爲60dp所以在 值-sw600dp 爲600dp寬度設備/ dimens.xml你有這樣

<dimen name="item_margin">60dp</dimen> 
以這種方式,這些值是基於設備寬度自動選擇

,因此您不必檢查設備寬度如果你想使模擬用不同的宇宙在Java代碼中

1

選擇合適的值C12豐富,具有硬編碼值意味着你必須重新編譯程序。

可能還有其他一些原因:如果從外部文件中讀取值,則該文件用作文檔,外部文件可能更容易檢查錯誤,可能有工具生成該文件或將其用於除了運行你的程序的其他目的,...

2

由於這些是真正的通用常量,屬性數量有限,你可以把它們放在代碼中,但很好地組織。

public enum Element { 
    // Name Mass Abund 
    C12("C", 12.0, .989), 
    He4(...), 
    O32(...), 
    ...; 

    public final String name; 
    public final double monoIsotopicMass; 
    public final double abundancy; 

    private Element(String name, double monoIsotopicMass, double abundancy) { 
     this.name = name; 
     this.monoIsotopicMass = monoIsotopicMass; 
     this.abundancy = abundancy; 
    } 
} 

for (Element elem : Element.values()) { 
    if (elem.abundancy > 0.5) { 
     ... 
    } 
}