【问题标题】:File vs array, which one is faster?文件 vs 数组,哪个更快?
【发布时间】:2016-01-01 17:11:05
【问题描述】:

我编写了一个程序,它在循环中多次读取文件中的字符。 如果我不关心内存使用情况,将文件的所有字符存储在数组中是否比使用 fgetc 访问字符更快?

【问题讨论】:

  • 磁盘读/写访问速度比访问内存慢!!
  • 您应该在问题中包含您想要比较的确切代码片段。
  • 我现在但是可能有 fgetc 的缓冲区
  • 即便如此,系统调用在本地代码旁边还是很慢。你连速度都没有自己测试过吗?
  • 我不会这样做,我只是意识到每调用几次 fgetc(获取一个单词),程序就会线性地遍历一个包含 300.000 多个字符串的数组。所以 fgetc 不是什么大问题。

标签: c arrays performance file


【解决方案1】:

一般来说,如果不了解平台的详细信息以及要比较的确切代码,就不可能回答性能问题。但是,在这种情况下,在大多数平台上缓冲数组中的文件内容可能要快得多。

首先,磁盘比主存慢几个数量级。

即使您的操作系统(或 libc)将数据缓存在 RAM 中,fgetc 仍会执行系统调用来获取它,这可能比简单的内存读取要慢得多。

另外由于系统调用相对较慢,使用fread而不是fgetc在单个调用中读取一个字节块。

【讨论】:

  • fread 读取字节,这几乎等同于chars (citation)。
  • fgetc 仍然进行缓冲,没有比 fread 更多的系统调用。
  • 我可以用 fread 替换对 fgetc 的调用并转换结果吗?
  • @FUZxxl 不一定——我在标准中找不到这个要求。即使它缓冲,轶事fgetc still turns out to be slower.
  • @Spooky 不,使用fread 将数据直接读入您的阵列。您可能需要演员表。
【解决方案2】:

我认为您至少应该使用某种形式的缓冲,而不是一次读取一个字符来填充缓冲区或数组。

最好使用fread() 来填充缓冲区/数组,或者您甚至可以查看内存映射 (mmap),以避免将数据从内核模式下的磁盘缓存复制到用户模式下的缓冲区中更高的性能(因为您的问题也被标记为performance)。虽然,对于单次读取,您的硬盘肯定会成为瓶颈。

如果您只需要读取一次数据,fread() with buffer(s) 可能是要走的路。

【讨论】:

    猜你喜欢
    • 2010-12-23
    • 2020-08-04
    • 2011-06-12
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 2011-09-24
    • 2020-01-25
    • 2014-04-16
    相关资源
    最近更新 更多