缓存TextReader
是否有意义?
TextReader
有自己的内部缓冲区,我可以在创建时设置大小,所以我有理由想要使用自己的缓冲区并调用Read( buffer, index, count )
而不是通过char使用{获取char {1}}?
答案 0 :(得分:2)
谁知道Read()方法的内部有多复杂?希望它们能够尽可能快速有效地进行优化。但是,调用单个Read(...)方法然后迭代字符数组可能会更快。但另一个重要问题是:在您的情况下,性能差异是什么?如果你每分钟只读一次或两次100个字符,那么性能可能并不重要。如果您按顺序处理多兆字节文件,那么您可能希望获得最佳性能。如果是后者,那么同样的答案总是适用:测量,不要猜测。
答案 1 :(得分: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/3
或ReadBlock/3
完全取决于您的需求和背景。例如,如果您正在编写解析器,则可能希望逐个字符地处理入站文本流,特别是因为TextReader
通过其Peek()
方法为您提供了一个前瞻性字符。免费。