緩衝TextReader
有意義嗎?是否需要緩衝TextReader?
TextReader
有其自己的內部緩衝區,我可以設置在創建時的大小,所以有一個原因,我想用我自己的緩衝區,並調用Read(buffer, index, count)
超過僅僅使用Read()
獲得通過炭炭?
緩衝TextReader
有意義嗎?是否需要緩衝TextReader?
TextReader
有其自己的內部緩衝區,我可以設置在創建時的大小,所以有一個原因,我想用我自己的緩衝區,並調用Read(buffer, index, count)
超過僅僅使用Read()
獲得通過炭炭?
誰知道Read()方法的內部有多複雜?希望它們能夠儘可能快速和高效地進行優化。但是,調用單個Read(...)方法然後迭代字符數組會更快。但另一個重要的問題是:在你的情況下,性能差異是重要的嗎?如果你每分鐘只讀一次或兩次100個字符,那麼表演可能並不重要。如果您按順序處理數兆字節的文件,那麼您可能需要最佳的性能。如果後者是這種情況,那麼相同的答案總是適用:措施,不要猜測。
使用緩衝讀取似乎是更快的方法。即使在讀取之後迭代緩衝區中的所有字符,它仍然更快。 – 2012-08-10 18:40:25
這是許多開發人員從未獲得的重要教訓:僅僅因爲解決方案中有更多的代碼並不意味着它會更慢。許多開發人員認爲,如果他們編寫的代碼更少,這自動意味着解決方案更快。天下沒有免費的午餐。你必須考慮你調用的方法涉及多少代碼。這些方法可以讓開發人員的生活更輕鬆。但這通常意味着這些方法的設計要比開發人員所做的要多。結果是:如果開發人員專門爲解決方案編寫代碼,則速度會快很多。 – Kent 2012-08-10 19:08:21
這取決於你在做什麼。如果你的閱讀固定不由從流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/3
或ReadBlock/3
是完全取決於你的需求和你的背景。例如,如果你正在編寫一個解析器,你可能想要逐個字符地處理入站的文本流,特別是因爲TextReader
通過免費的Peek()
方法爲你提供了一個預見的字符。
現在多字節字符很時髦 – spender 2012-08-09 00:16:58
如果你真的在讀字符,那麼迭代數組可能會更快。 – 2012-08-09 00:17:07
它需要更快嗎?在性能問題出現之前,「可讀性」可能會更好? – spender 2012-08-09 00:18:47