2011-07-23 42 views
4

在我的類中的一個,我有讀取和寫入型小數的陣列的例行程序(使用BinaryReader/BinaryWriterReadDecimal()Write()方法,即:如何在文件中讀寫C#BigIntegers?

BinaryReader inputReader = new BinaryReader(File.OpenRead(BaseFilePath)); 
for (int x = 0; x < 6; x++) { 
    for (int y = 0; y < m_Codes[x].GetLength(0); y++) { 
     for (int z = 0; z < m_Codes[x].GetLength(1); z++) { 
      m_Codes[x][y, z] = inputReader.ReadDecimal(); 
     } 
    } 
} 

for (int x = 0; x < 6; x++) { 
    for (int y = 0; y < m_Codes[x].GetLength(0); y++) { 
     for (int z = 0; z < m_Codes[x].GetLength(1); z++) { 
      outputWriter.Write(m_Codes[x][y, z]); 
     } 
    } 
} 

..正如你所看到的,在設計時只有第一維是已知的,其他維在運行時有所不同。 ith ReadBigInteger()和類似的寫作方法,但似乎沒有支持的流類;我猜這是因爲BigInteger可以有任意長度。

關於我能想到的最好的事情是通過將BigInteger轉換爲byte[]數組,然後編寫該數組的長度,然後將每個字節寫入數組本身(然後做相反的操作讀它)

兩個問題:

1)這是一個更好的辦法?

2)我的主要動機是希望提高性能; boe BigInteger甚至比Decimal表現得更好?

+2

你需要更好的表現嗎? – Oded

+1

Decimal有什麼不好? – Tigran

+0

@Tigran:Decimal的性能比int,long,float或double等原始類型的性能差得多。我不知道它們與BigInteger相比 – Falanwe

回答

2

你可以轉換爲字符串(BigInteger.ToSting()),然後寫字符串(字符串直接與BinaryReaderBinaryWriter這避免了需要做任何編碼/解碼自己的支持)。

然後將其轉換回BigInteger.Parse

爲了解決績效問題:我認爲您需要針對您感興趣的案例進行衡量。

當值相對較小(比如ABS(值))我想期望BigInteger的性能是一對夫婦的long數量級之內的表現(即不超過〜 500倍慢)。但是,如果BigInteger實例獲得更大的操作將需要更長的時間(更多位必須被操縱)。另一方面,decimal在所有尺度上都應該具有合理一致的性能,但它可能比其範圍相交處的數字要慢得多(decimal是一個更復雜的表示:比例因子並通過計算保留實際有效數字;但沒有這種複雜性的直接影響)。

並記住:BigDecimal是確切的 - 它從未輪迴; decimal是近似值 - 數據可能會下降並被丟棄。任何一個業務問題似乎都不可能支持。

4

有一個相當簡單的方法:在反序列化時調用BigDecimal.ToByteArray來進行序列化,並調用BigDecimal(byte[])構造函數。無可否認,這最終會複製數據,但我仍然認爲它的速度相當快。

更值得關注的是:序列化性能還是算術性能?

至於BigIntegerdecimal之間的任何速度差異 - 您應該測試它是否實際執行的操作,意識到它們的行爲不同(例如,將3除以2顯然會給出不同的答案) 。