C#fileStream.Seek vs fileStream.ReadBytes的性能。为什么后者更快?

发布于 2025-01-26 18:48:56 字数 1334 浏览 3 评论 0原文

在我的应用程序中,我需要经常移动文件流的位置指针,然后将少数字节转发。使用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文