GCC 4.1.2 文档对选项有这样的说法-pipe
:
-管道
使用管道而不是临时文件在编译的各个阶段之间进行通信。这在汇编程序无法从管道中读取的某些系统上不起作用;但是 GNU 汇编器没有问题。
我假设如果我的系统的汇编程序不支持管道,我可以从错误消息中判断出来,所以除了这个问题之外,我何时使用该选项有什么关系?决定使用它应该考虑哪些因素?
GCC 4.1.2 文档对选项有这样的说法-pipe
:
-管道
使用管道而不是临时文件在编译的各个阶段之间进行通信。这在汇编程序无法从管道中读取的某些系统上不起作用;但是 GNU 汇编器没有问题。
我假设如果我的系统的汇编程序不支持管道,我可以从错误消息中判断出来,所以除了这个问题之外,我何时使用该选项有什么关系?决定使用它应该考虑哪些因素?
它有+和-的考虑。从历史上看,同时运行编译器和汇编器会对 RAM 资源造成压力。
按照今天的标准,Gcc 很小,并且-pipe
增加了一些多核可访问的并行执行。
但是出于同样的原因,CPU 是如此之快,以至于它可以创建该临时文件并将其读回,而您甚至都没有注意到。而且由于-pipe
从来都不是默认模式,所以它偶尔会有点作用。单个开发人员通常会报告没有注意到时差。
现在,那里有一些大型项目。您可以查看将构建所有 Firefox 或 NetBSD 或类似的东西的单个树,它非常大。包含所有 X 的东西,比如说,作为次要子系统组件。当工作涉及数千行 C 文件中的数百万行代码时,您可能会也可能不会注意到差异。我相信你知道,人们通常一次只做一小部分这样的事情。但是,如果您是发布工程师或在构建服务器上工作,或在stdio.h 中更改某些内容,您可能希望构建整个系统以查看是否破坏了任何内容。而现在,每一滴表现都可能很重要……
根据我们对中型项目的经验,添加-pipe
对构建时间没有明显影响。我们遇到了一些问题(如果遇到错误,有时无法删除中间文件,IIRC),因此由于它没有为我们带来任何好处,我们停止使用它而不是尝试解决这些问题。
现在尝试一下,当源/构建目标位于 NFS(Linux 网络)上时,它的构建速度似乎要快一些。虽然内存使用率很高。如果您从不填满 RAM 并且在 NFS 上有源代码,那么使用 -pipe 似乎是一种胜利。
老实说,几乎没有理由不使用它。-pipe 只会使用更多的 ram,如果这个盒子是构建代码,我会假设它有一个不错的数量。如果您的系统使用更保守的文件系统,它可以显着缩短构建时间,该文件系统会在此过程中写入然后删除所有临时文件(例如 ext3。)
一个优点是,使用 -pipe 编译器将减少与文件系统的交互。即使它是一个 ram 磁盘,在使用临时文件时数据仍然需要通过块 I/O 和文件系统层,而使用管道它变得更加直接。
对于文件,编译器是否首先需要完成编写才能调用汇编程序。管道的另一个优点是编译器和汇编器可以同时运行,并且更多地使用了 SMP 架构。尤其是当编译器需要等待源文件中的数据时(因为阻塞 I/O 调用),操作系统可以给汇编器充分的 CPU 时间,让它更快地完成工作。
从硬件的角度来看,我想您会使用它-pipe
来保持硬盘驱动器的使用寿命。