【问题标题】:When should I use GCC's -pipe option?我什么时候应该使用 GCC 的 -pipe 选项?
【发布时间】:2010-12-03 12:46:06
【问题描述】:

GCC 4.1.2 documentation-pipe 选项有这样的看法:

-管道

在编译的各个阶段之间使用管道而不是临时文件进行通信。这在汇编程序无法从管道中读取的某些系统上不起作用;但 GNU 汇编器没有问题。

如果我的系统的汇编程序不支持管道,我假设我能够从错误消息中判断出来,所以除了这个问题之外,我何时使用该选项是否重要?决定使用它应该考虑哪些因素?

【问题讨论】:

  • 我认为您可以确信,如果您的 GCC 是使用不支持管道输入的汇编程序配置的,那么 GCC 将拒绝 -pipe 选项或忽略它(更可能是后者)。

标签: gcc pipe compiler-options


【解决方案1】:

通常没有任何区别

它有 +- 考虑因素。从历史上看,同时运行编译器和汇编器会对 RAM 资源造成压力。

按照今天的标准,Gcc 很小,-pipe 增加了一点多核可访问的并行执行。

但出于同样的原因,CPU 是如此之快,以至于它可以创建该临时文件并将其读回,而您甚至都不会注意到。而且由于-pipe 从来都不是默认模式,所以它偶尔会有点作用。单个开发人员通常会报告没有注意到时差。

现在,那里有一些大型项目。您可以查看将构建所有 Firefox 或 NetBSD 或类似的东西的单个树,它非常大。包含所有 X 的东西,比如说,作为次要子系统组件。当工作涉及数千行 C 文件中的数百万行代码时,您可能会也可能不会注意到差异。我相信你知道,人们通常一次只处理这样的一小部分。但是,如果您是发布工程师或在构建服务器上工作,或者在stdio.h, 中更改某些内容,您可能希望构建整个系统以查看是否破坏了任何内容。而现在,每一滴表现都可能很重要......

【讨论】:

  • the CPU is so fast that it can create that temporary file and read it back without you even noticing 声明错误。这里的瓶颈不是 CPU,而是驱动器的 I/O。想象一下,由于某种原因,您正在慢速 USB 记忆棒上编译一个大项目:您将厌倦等待所有的读/写操作。当然 GNU/Linux 缓存文件而不是实际写入。但这不是 GCC 的优点。那么我们必须使用-pipe吗?是的,最好使用。
  • @angel :我怀疑这样的 i/o 延迟甚至不会在现代系统的关键循环中:添加内存缓存的效果,只要你有足够的内存来存储最近的文件,所有实时操作都将在那里发生,设备上的“真正写入”稍后会异步发生。
  • @angel,因为操作系统有一个大的 RAM 页面缓存可用,特别是当 /tmp 安装(应该是)在 RAM 上或没有完全恢复写入障碍时,我的实际开销在这种情况下,/O 仍然是 CPU。
  • 当使用大型 C++ 模板(如 OpenSCAD 中的 CGAL)时,我发现阻止使用管道,而是要求它在文件上使用汇编程序,可以防止机器用完RAM 和命中交换空间。这是在 RAM 相对较低的机器上,如 512MB 或 1G,也取决于是否使用了 -g 和 -O2
【解决方案2】:

老实说,几乎没有理由不使用它。 -pipe 只会使用更多的 ram,如果这个盒子是构建代码,我会假设它有一个不错的数量。如果您的系统使用更保守的文件系统,该文件系统会在整个过程中写入然后删除所有临时文件(例如 ext3),则可以显着缩短构建时间。

【讨论】:

  • 您的假设不正确 - 构建代码的机器通常内存很少。以 Raspberry Pi 为例。
  • @JamesMoore 你在遇到受限系统时交叉编译而不是在目标平台上处理内存问题,对吧?
【解决方案3】:

从硬件的角度来看,我猜你会使用-pipe 来保持硬盘的使用寿命。

【讨论】:

  • 我坚信 Linux 实际上并没有将文件保存到硬盘驱动器,而只是将它放在 RAM 中的缓存中。
【解决方案4】:

根据我们对中型项目的经验,添加 -pipe 对构建时间没有明显影响。我们遇到了一些问题(如果遇到错误,有时无法删除中间文件,IIRC),因此由于它没有为我们带来任何好处,我们停止使用它,而不是尝试解决这些问题。

【讨论】:

  • +1 用于基于证据的答案,而不是“它不使用磁盘,所以它可能更好......”
  • 查看@peterkarasev 以了解 -pipe 在分布式文件系统中工作时确实会产生积极影响。
【解决方案5】:

现在尝试一下,当源/构建目标位于 NFS(Linux 网络)上时,它的构建速度似乎适中。虽然内存使用率很高。如果您从不填满 RAM 并且在 NFS 上有源代码,那么使用 -pipe 似乎是一种胜利。

【讨论】:

    【解决方案6】:

    一个优点是,使用 -pipe 编译器会减少与文件系统的交互。即使是 ram 磁盘,在使用临时文件时数据仍然需要通过块 I/O 和文件系统层,而使用管道则变得更加直接。

    对于文件,编译器是否首先需要完成编写才能调用汇编器。管道的另一个优点是编译器和汇编器可以同时运行,并且它更多地使用了 SMP 架构。尤其是当编译器需要等待源文件中的数据时(因为阻塞 I/O 调用),操作系统可以给汇编器充分的 CPU 时间,让它更快地完成工作。

    【讨论】:

      猜你喜欢
      • 2011-01-26
      • 2012-03-23
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      • 2016-08-09
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      相关资源
      最近更新 更多