【问题标题】:popen performance in C在 C 中表现出色
【发布时间】:2011-06-24 22:36:37
【问题描述】:

我正在设计一个计划用 C 语言实现的程序,我对调用外部程序的最佳方式(在性能方面)有疑问。用户将为我的程序提供一个文件名,然后我的程序将使用该文件作为输入运行另一个程序。然后我的程序将处理另一个程序的输出。

我的典型方法是将其他程序的输出重定向到一个文件,然后让我的程序在完成后读取该文件。但是,我知道 I/O 操作非常昂贵,我想让这个程序尽可能高效。

我稍微看了看,发现popen 命令用于运行系统命令并获取输出。这种方法的性能与我刚才描述的方法的性能相比如何? popen 只是将外部程序的输出写入临时文件,还是将程序输出保存在内存中?

或者,是否有其他方法可以提供更好的性能?

【问题讨论】:

  • 读写步骤的相对表现如何?外部流程产生结果的速度是否比您处理结果的速度快?

标签: c performance system popen


【解决方案1】:

将子命令重定向到文件的问题在于它可能不安全,而popen 通信不能被另一个进程拦截。另外,如果您正在运行您的主程序的多个实例(以及您的子命令),您需要确保文件名是唯一的。 popen 解决方案不受此影响。

popen 的性能很好,只要你不读/写一个字节块。始终读/写 512 的倍数(如 4096)。但这也适用于文件操作。 popen 通过管道连接你的进程和子进程,所以如果你不读,那么管道就会填满,子进程不能写,反之亦然。所以所有交换的数据都在内存中,但数量很少。

【讨论】:

    【解决方案2】:

    (假设是 Unix 或 Linux)

    如果文件在慢速磁盘上,写入临时文件可能会很慢。这也意味着整个输出必须适合磁盘。

    popen 使用管道连接到另一个程序,这意味着输出将逐步发送到您的程序。在生成时,它会被逐块复制到您的程序中。

    【讨论】:

      【解决方案3】:

      1) popen 将程序输出保存在内存中。它实际上使用管道在进程之间传输数据。

      2) popen 恕我直言,看起来是性能的最佳选择。

      与文件相比,它还具有减少延迟的优势。 IE。您的程序将能够在生成时即时获得其他程序的输出。如果这个输出很大,那么你不必等到其他程序完成后才开始处理它的输出。

      【讨论】:

        【解决方案4】:

        popen 几乎可以满足您的要求:它执行 pipe-fork-exec 习语,并为您提供一个可以读取和写入的文件指针。

        但是,管道缓冲区的大小(~4K iirc)是有限制的,如果你读取速度不够快,其他进程可能会阻塞。

        您可以访问共享内存作为挂载点吗? [在 linux 系统上有一个 /dev/shm 挂载点]

        【讨论】:

          【解决方案5】:

          在 Unix 系统上,popen 将通过内存管道传递数据。假设数据没有被换出,它不会命中磁盘。这应该可以在不修改被调用程序的情况下为您提供尽可能好的性能。

          【讨论】:

          • 如果分析数据的过程比生成数据的过程慢很多,那么管道解决方案更差
          • @Foo,不一定 - 如果创建数据的程序总是快,那么较慢的程序将永远赶不上,所以它最终还是会完成更多或同时减少。
          • @Foo Bah:通常不会比写入单独的文件然后处理它更糟糕。即使写入器阻塞,处理端也可能有持续的数据供应,并且一旦写入端有东西要写就可以开始。那挺好的。写入端在一系列短脉冲中工作通常不会影响整体运行时间,也不会影响总 CPU 使用率。
          • @Foo 最大值是,是的。但无论如何,使用 shmem 需要修改有问题的程序,因此并不是真正的直接比较。并且接收程序总是可以在一个单独的线程中假脱机到它自己想要的任何大小的缓冲区中!
          • 喜欢拖钓,写“然后管道解决方案更糟糕[比写入文件并读回]”,然后切换到谈论共享内存,然后到 /dev/shm .
          猜你喜欢
          • 2010-11-14
          • 1970-01-01
          • 1970-01-01
          • 2021-01-19
          • 1970-01-01
          • 2020-08-28
          • 2022-06-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多