使用SeekOrigin执行FileStream.Seek().在不需要查找的情况下开始优化

本文关键字:查找 不需要 情况下 优化 开始 执行 SeekOrigin FileStream Seek 使用 | 更新日期: 2023-09-27 17:59:11

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

=================|收割台|=================|我想要的数据|=================|我忽略的数据|=================

为了读取一行数据,我计算哪个区块具有我想要的行,Seek()到适当的偏移量,并读取固定数量的字节。当从单个块中读取多行时,我实际上可以跳过除第一个调用之外的所有Seek()调用,因为指针在Read()之后已经在我想要的位置。但当我跳到一个新的区块时,我需要Seek()。为了简单起见,我总是使用SeekOrigin.Begin计算文件中下一行的绝对偏移量和它的Seek()FileStream.Seek()(或底层SetFilePointer()本机函数)是否经过优化以识别给定的寻道是非操作?如果没有,我可能应该优化我自己的代码,因为它不是闪电般的快。

使用SeekOrigin执行FileStream.Seek().在不需要查找的情况下开始优化

答案似乎是肯定的。

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

当您查阅Seek的源时,可以看到有人试图从读取缓冲区中保留尽可能多的内容。

如果您查看FileStream,请在此处查找源代码:http://referencesource.microsoft.com/#mscorlib/system/io/filestream.cs,329c77a859ac60bd

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

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