2015-10-23 37 views
2

我有此對象:Dictionary<byte, BitArray>()改善編碼週期

它充滿了霍夫曼樹的值。到流的每個字節編碼爲霍夫曼二進制值I做:

// Bytes are the bytes to be encoded, encoded is the output string 
foreach (byte c in Bytes) 
{ 
    encoded += _translationTable[c].ToBitsString(); 
} 

這是擴展方法:

//Converts the bitarray in a binary string 
public static string ToBitsString(this BitArray bitArr) 
{ 
    string retStr = string.Empty; 

    foreach (bool bit in bitArr) 
    { 
     retStr += (bit) ? "1" : "0"; 
    } 

    return retStr; 
} 

它需要將近3秒編碼數據的64KB,有一種方法以更快的方式實現這個結果?

+2

什麼是「編碼」? –

+0

什麼是ToBitsString? – Richard

+0

對不起,我搞砸了,我編輯了我的問題! – Phate01

回答

7

這聽起來像你正在循環中執行字符串連接。這是一個very inefficient way of building a new string。我懷疑你想:

var builder = new StringBuilder(); 
foreach (byte c in Bytes) 
{ 
    builder.Append(_translationTable[c].ToBitsString()); 
} 
var encoded = builder.ToString(); 

現在,我們可以看到ToBitsString做,很容易把它改寫接受StringBuilder追加到:

public static void AppendBitsTo(this BitArray bitArray, StringBuilder builder) 
{ 
    foreach (bool bit in bitArray) 
    { 
     builder.Append(bit ? "1" : "0"); 
    } 
} 

然後循環體將是:

_translationTable[c].AppendBitsTo(builder); 
+0

我忘了發一張我的節目:D請看看! – Phate01

+0

@ Phate01:對,所以你有字符串連接*以及*(我相應地編輯了我的答案。) –

+0

我還沒有測試過,但我猜測問題是一個問題迭代次數。平均而言,BitArray對於64kb是10位長,所以程序正在進行655360次迭代。我要去測試這個解決方案 – Phate01