gpt4 book ai didi

c# - 引用stream.Position显着增加执行时间

转载 作者:行者123 更新时间:2023-12-03 09:26:31 25 4
gpt4 key购买 nike

知道为什么引用流的 Position 属性会大幅增加 IO 时间吗?

执行时间:

        sw.Restart();
fs = new FileStream("tmp", FileMode.Open);
var br = new BinaryReader(fs);
for (int i = 0; i < n; i++)
{
fs.Position+=0; //Should be a NOOP
a[i] = br.ReadDouble();
}
Debug.Write("\n");
Debug.Write(sw.ElapsedMilliseconds.ToString());
Debug.Write("\n");
fs.Close();
sw.Stop();
Debug.Write(a[0].ToString() + "\n");
Debug.Write(a[n - 1].ToString() + "\n");

比没有“fs.Position+=0;”的等效循环慢约 100 倍。通常,使用 Seek(或操作 Position 属性)的目的是在不需要文件中的所有数据时加快速度。但是,例如,如果您只需要文件中的每个第二个值,那么读取整个文件并丢弃不需要的数据显然比通过移动 Stream.Position 跳过文件中的每个第二个值要快得多p>

最佳答案

你正在做两件事:

  • 获取位置
  • 设置

完全有可能每个都与底层 Win32 API 执行直接交互,而通常情况下,由于缓冲,您可以读取相当多的数据,而无需与 native 代码进行互操作.

我对情况变得更糟的程度感到有点惊讶,但我并不惊讶它更糟。我认为值得您进行单独的测试来找出哪个效果更好 - 读取或写入。因此,请编写类似的代码,读取或写入。请注意,这应该会影响您稍后编写的代码,但它可能会进一步满足您的好奇心。

你也可以尝试

fs.Seek(0, SeekOrigin.Current);

...这更有可能作为真正的空操作而被忽略。但即便如此,使用 fs.Seek(1, SeekOrigin.Current) 跳过单个字节可能会再次变得昂贵。

关于c# - 引用stream.Position显着增加执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20333332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com