我对 StreamReader 的缓冲区使用有疑问。
这里:http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx你可以看到:
“从 Stream 读取时,使用与流的内部缓冲区大小相同的缓冲区会更有效。”。
根据这个weblog http://www.weblogs.asp.net/justin_rogers/archive/2004/07/10/179226.aspx,StreamReader的内部缓冲区大小为2k,因此我可以使用以下命令有效地读取一些kbs的文件Read()
避免Read(Char[], Int32, Int32)
.
此外,即使文件很大,我也可以构造 StreamReader 传递大小buffer http://www.msdn.microsoft.com/en-us/library/ms143458.aspx
那么为什么需要外部缓冲器呢?
看看实施情况StreamReader.Read
方法,你可以看到它们都调用内部ReadBuffer
method.
Read()
方法首先读入内部缓冲区,然后逐个读取缓冲区。
public override int Read()
{
if ((this.charPos == this.charLen) && (this.ReadBuffer() == 0))
{
return -1;
}
int num = this.charBuffer[this.charPos];
this.charPos++;
return num;
}
Read(char[]...)
称为ReadBuffer
也是如此,但改为进入调用者提供的外部缓冲区:
public override int Read([In, Out] char[] buffer, int index, int count)
{
while (count > 0)
{
...
num2 = this.ReadBuffer(buffer, index + num, count, out readToUserBuffer);
...
count -= num2;
}
}
所以我想唯一的性能损失是你需要调用Read()
比Read(char[])
由于它是一个虚拟方法,调用本身会减慢速度。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)