C#fileStream.Seek vs fileStream.ReadBytes的性能。为什么后者更快?
在我的应用程序中,我需要经常移动文件流的位置指针,然后将少数字节转发。使用fileStream.readbytes而不是fileStream.Seek进行实验表明,前者的速度明显比后者快得多。
考虑以下最小示例:
static void OptimizedSeek(Stream theStream, long offset)
{
if (offset!= 0)
{
if (offset> 0 && offset< 4096)
{
theStream.Read(new byte[offset], 0, (int)offset);
}
else
{
theStream.Seek(offset, SeekOrigin.Current);
}
}
}
static void Main(string[] args)
{
string inputFile = "datafile.dat";
FileStream myStream = new FileStream(inputFile,FileMode.Open);
Random r = new Random();
Console.WriteLine(myStream.Position);
var maxLength = myStream.Length;
int delta = r.Next(0, 1000);
long pos = delta;
while (pos < maxLength)
{
//myStream.Seek(delta, SeekOrigin.Current);
OptimizedSeek(myStream, delta);
delta = r.Next(0, 1000);
pos += delta;
}
Console.WriteLine(myStream.Position);
}
如果我使用mystream.seek(delta,seekorigin.current)而不是优化的seek,则性能会明显更糟(在我的系统上10次)。 datafile.dat在这里约800MB。
有人知道为什么我会看到这种性能差异吗?从一开始,我希望寻求为此目的进行优化。
我正在使用.net5并为Windows编译。
In my application I need to frequently move the position pointer of a file stream forward a small number of bytes. Experimentation with using FileStream.ReadBytes rather than FileStream.Seek for this purpose revealed that the former was significantly faster than the latter.
Consider the following minimal example:
static void OptimizedSeek(Stream theStream, long offset)
{
if (offset!= 0)
{
if (offset> 0 && offset< 4096)
{
theStream.Read(new byte[offset], 0, (int)offset);
}
else
{
theStream.Seek(offset, SeekOrigin.Current);
}
}
}
static void Main(string[] args)
{
string inputFile = "datafile.dat";
FileStream myStream = new FileStream(inputFile,FileMode.Open);
Random r = new Random();
Console.WriteLine(myStream.Position);
var maxLength = myStream.Length;
int delta = r.Next(0, 1000);
long pos = delta;
while (pos < maxLength)
{
//myStream.Seek(delta, SeekOrigin.Current);
OptimizedSeek(myStream, delta);
delta = r.Next(0, 1000);
pos += delta;
}
Console.WriteLine(myStream.Position);
}
If I instead use myStream.Seek(delta, SeekOrigin.Current) instead of OptimizedSeek, performance is significantly worse (10 time on my system). datafile.dat is here around 800mb.
Anyone with knowledge as to why I see this difference in performance? At the outset I would expect Seek to be optimized for this exact purpose.
I'm using .net5 and compiling for Windows.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论