2012-08-09 105 views
0

緩衝TextReader有意義嗎?是否需要緩衝TextReader?

TextReader有其自己的內部緩衝區,我可以設置在創建時的大小,所以有一個原因,我想用我自己的緩衝區,並調用Read(buffer, index, count)超過僅僅使用Read()獲得通過炭炭?

+1

現在多字節字符很時髦 – spender 2012-08-09 00:16:58

+0

如果你真的在讀字符,那麼迭代數組可能會更快。 – 2012-08-09 00:17:07

+2

它需要更快嗎?在性能問題出現之前,「可讀性」可能會更好? – spender 2012-08-09 00:18:47

回答

2

誰知道Read()方法的內部有多複雜?希望它們能夠儘可能快速和高效地進行優化。但是,調用單個Read(...)方法然後迭代字符數組會更快。但另一個重要的問題是:在你的情況下,性能差異是重要的嗎?如果你每分鐘只讀一次或兩次100個字符,那麼表演可能並不重要。如果您按順序處理數兆字節的文件,那麼您可能需要最佳的性能。如果後者是這種情況,那麼相同的答案總是適用:措施,不要猜測。

+0

使用緩衝讀取似乎是更快的方法。即使在讀取之後迭代緩衝區中的所有字符,它仍然更快。 – 2012-08-10 18:40:25

+0

這是許多開發人員從未獲得的重要教訓:僅僅因爲解決方案中有更多的代碼並不意味着它會更慢。許多開發人員認爲,如果他們編寫的代碼更少,這自動意味着解決方案更快。天下沒有免費的午餐。你必須考慮你調用的方法涉及多少代碼。這些方法可以讓開發人員的生活更輕鬆。但這通常意味着這些方法的設計要比開發人員所做的要多。結果是:如果開發人員專門爲解決方案編寫代碼,則速度會快很多。 – Kent 2012-08-10 19:08:21

1

這取決於你在做什麼。如果你的閱讀固定不由從流CR + LF對分隔長度的記錄,你會想做的事的

public static void Process() 
{ 
    using (Stream s = OpenCommunicationsStream()) 
    using (TextReader tr = new StreamReader(s) ) 
    { 
    char[] record = char[80] ; 
    int chars_read ; 

    while ((chars_read=tr.Read(record,0,record.Length)) == record.Length) 
    { 
     DoSomethingWithRecord(record) ; 
    } 
    if (chars_read > 0) throw new InvalidDataException("wrong length record") ; 
    } 
    return ; 
} 

線的東西,爲什麼你可以使用Read/0,而不是Read/3ReadBlock/3是完全取決於你的需求和你的背景。例如,如果你正在編寫一個解析器,你可能想要逐個字符地處理入站的文本流,特別是因爲TextReader通過免費的Peek()方法爲你提供了一個預見的字符。