代码之家  ›  专栏  ›  技术社区  ›  dreamlax

读取输入行的速度比fgets快?

  •  11
  • dreamlax  · 技术社区  · 16 年前

    我正在编写一个程序,其中性能非常重要,但并不重要。目前我正在阅读 FILE* 一行一行我用 fgets 获取每一行。在使用了一些性能工具之后,我发现在应用程序运行的20%到30%的时间内,它就在 FGET .

    有没有更快的方法来获取一行文本?我的应用程序是单线程的,不打算使用多个线程。输入可以来自stdin或文件。事先谢谢。

    8 回复  |  直到 9 年前
        1
  •  7
  •   anon    16 年前

    您不必说您在哪个平台上,但如果它类似于Unix,那么您可能需要尝试read()系统调用,它不会执行fgets()等所做的额外缓冲层。这可能会使事情稍微加快,另一方面,它可能会很好地减慢事情的速度-唯一的方法是吸它看。

        2
  •  4
  •   dmityugov    16 年前
    1. 使用fgets_Unlocked(),但请先仔细阅读它的功能

    2. 使用fgetc()或fgetc_unlocked()而不是fgets()获取数据。使用fgets(),您的数据被复制到内存中两次,首先是由C运行时库从一个文件复制到一个内部缓冲区(缓冲流I/O),然后从该内部缓冲区复制到程序中的一个数组中。

        3
  •  4
  •   user82238    16 年前

    一次读取整个文件进入缓冲区。

    处理来自该缓冲区的行。

    这是最快的解决方案。

        4
  •  3
  •   GManNickG    16 年前

    您可以尝试通过将大量数据读取到RAM中,然后再进行相应的工作来尽量减少从磁盘读取所花费的时间。从磁盘读取速度很慢,因此通过读取(理想情况下)整个文件一次,然后处理它,可以将花费的时间减到最少。

    类似于CPU缓存最小化CPU实际返回到RAM的时间的方式,您可以使用RAM最小化实际进入磁盘的次数。

        5
  •  2
  •   Hexagon    16 年前

    根据环境的不同,使用setvbuf()增大文件流使用的内部缓冲区的大小可能会提高性能,也可能不会提高性能。

    这是语法-

    setvbuf (InputFile, NULL, _IOFBF, BUFFER_SIZE);
    

    其中inputfile是使用fopen()打开的文件的文件*,buffer_size是缓冲区的大小(由此调用为您分配)。

    您可以尝试各种缓冲区大小,看看是否有任何积极的影响。请注意,这是完全可选的,运行时可能对该调用不做任何操作。

        6
  •  2
  •   Jonathan Leffler    16 年前

    如果数据来自磁盘,则可以绑定到IO。

    如果是这样的话,就可以得到一个更快的磁盘(但首先要检查您是否充分利用了现有的磁盘……一些Linux发行版并不能优化磁盘访问。( hdparm ),提前将数据放入内存(例如复制到RAM磁盘),或者准备等待。


    如果你没有IO限制,你可能会浪费很多时间来复制。您可以从所谓的零拷贝方法中获益。类似内存映射文件,只通过指针访问它。

    这有点超出我的专业知识范围,所以你应该阅读或等待更多的知识帮助。

    顺便说一句——你可能会投入比问题更大的工作;也许更快的机器可以解决你所有的问题……

    NB——还不清楚您是否可以存储映射标准输入…

        7
  •  0
  •   dennismv    16 年前

    查看fread()。它对我来说读得更快,特别是当fread的buffer设置为65536时。缺点:您需要做大量的工作,并且基本上需要编写自己的getline函数来从二进制读取转换为文本。 退房: file I/O

        8
  •  0
  •   Fabian N.    9 年前

    如果操作系统支持,您可以尝试异步文件读取,也就是说,当CPU忙于做其他事情时,文件被读取到内存中。所以,代码是这样的: 十年

    start asynchronous read
    loop:
      wait for asynchronous read to complete
      if end of file goto exit
      start asynchronous read
      do stuff with data read from file
      goto loop
    exit:
    

    如果您有多个CPU,那么一个CPU读取文件并将数据解析为行,另一个CPU获取每一行并处理它。

    推荐文章