C# FileStream.Seek()是否与SeekOrigin.Begin一起在不需要搜索时进行优化?

C# FileStream.Seek()是否与SeekOrigin.Begin一起在不需要搜索时进行优化?,c#,filestream,C#,Filestream,我有一个类,它使用FileStream从大文件中一次读取一行图像数据。在内部,文件被分成块,每个块看起来如下: ================= | Header | ================= | Data I Want | ================= | Data I Ignore | ================= ================= |标题| ================= |我想要的数据| =================

我有一个类,它使用
FileStream
从大文件中一次读取一行图像数据。在内部,文件被分成块,每个块看起来如下:

================= | Header | ================= | Data I Want | ================= | Data I Ignore | ================= ================= |标题| ================= |我想要的数据| ================= |我忽略的数据| =================
要读取一行数据,我计算哪个块具有我想要的行,
Seek()
到适当的偏移量,并读取固定数量的字节。当从一个块中读取多行时,我实际上可以跳过所有
Seek()
调用,但可以跳过第一个调用,因为指针已经在
Read()
之后我想要的位置。但是当跳转到新的块时,我需要
Seek()
。为简单起见,我总是计算文件中下一行的绝对偏移量,并使用
SeekOrigin.Begin
对其进行
Seek()
FileStream.Seek()?如果没有,我可能应该优化我自己的代码,因为它不是闪电般的快。

如果您查看文件流,请在此处查找源代码:

您可以看到,不管文件指针的旧位置如何,都会调用SeekCore方法,它本身调用Win32Native.SetFilePointer,这是一个内核调用


因此答案是否定的,它没有优化,如果可以的话,你应该自己优化它。

如果你看一下文件流。在这里查找源代码:

您可以看到,不管文件指针的旧位置如何,都会调用SeekCore方法,它本身调用Win32Native.SetFilePointer,这是一个内核调用


所以答案是否定的,它不是优化的,如果可以的话,你应该自己优化它。

答案似乎是肯定的

这里唯一关心的是读取缓冲区。我们可以假设底层的SetFilePointer()调用将是一个查找到当前的非op


当您查阅时,可以看到已尝试从读取缓冲区中保留尽可能多的内容

答案似乎是肯定的

这里唯一关心的是读取缓冲区。我们可以假设底层的SetFilePointer()调用将是一个查找到当前的非op


当您查阅时,可以看到已尝试从读取缓冲区中保留尽可能多的内容

对于.net源代码,不需要指向第三方站点。我使用了第一个谷歌搜索结果,但确实最好使用微软的原始文档。我更新了链接一个简单的方法到达那里,去,它将重定向到你没有必要在第三方网站点.net源代码。我使用了第一个谷歌搜索结果,但确实最好使用微软的原始文档。我更新了链接一个简单的方法到达那里,转到,它会将您重定向到代码。代码不会完全忽略无操作搜索的情况,但它将始终执行对win32api的内核调用,这可能是搜索方法可能受到的最大惩罚(除了最终会发生的流刷新)当然会有一些开销,但即使是内核调用,与执行任何实际IO相比都是微不足道的。显然,如果HD不需要IO,那么.NET的代码实际上做什么并不重要,因为它不需要IO。我相信OP想知道的是,他是否可以通过在不必要的时候省略搜索来获得性能。@Gilthans:“如果是这样,问题就没有意义了”--听起来是对的。@Henkholtman是对的,我主要是想避免不必要的IO。我对Win32中的IO及其上面的.NET内容了解不够,无法确保使用SeekOrigin.Begin搜索到当前位置不需要HD从开始到该位置读取文件。代码并没有完全忽略无操作搜索的情况,但它始终会执行对Win32 API的内核调用,这可能是Seek方法可能带来的最大损失(除了最终会发生的流刷新),当然会有一些开销,但与执行任何实际IO相比,即使是内核调用也微不足道。如果是这样,问题就没有意义了。显然,如果HD不需要IO,那么.NET的代码实际上做什么并不重要,因为它不需要IO。我相信OP想知道的是,他是否可以通过在不必要的时候省略搜索来获得性能。@Gilthans:“如果是这样,问题就没有意义了”--听起来是对的。@Henkholtman是对的,我主要是想避免不必要的IO。我对Win32中的IO及其上面的.NET内容了解不够,无法确保使用SeekOrigin.Begin搜索到当前位置不需要HD从一开始就将文件读取到该位置。“它的速度不太快”——我怀疑这与调用
Seek()
的频率有关。当然,如果没有可靠地再现代码当前状态的良好工具和明确规定的性能目标,就不可能以任何有用或精确的方式讨论优化过程中可能需要或不需要的内容。如果您关心性能,并且想知道不同的实现和/或优化如何影响性能,您需要自己进行测试。只需按照你想考虑的方式编写代码并比较结果。我问的问题是,我高估了在优化不必要的<代码> >(或)代码>调用中所涉及的工作,并希望有人会知道,微软的代码已经做出了这种优化。我担心的是,出于我可能猜不到的原因,SeekOrigin.Begin可能会要求HD找到文件的开头,并按顺序读取文件