69

GCC 4.1.2 文档对选项有这样的说法-pipe

-管道

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

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

4

6 回答 6

48

它通常没有任何区别

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

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

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

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

于 2009-10-03T06:04:32.393 回答
46

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

于 2010-01-07T13:26:49.167 回答
33

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

于 2010-05-25T06:21:40.017 回答
12

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

于 2009-10-03T06:04:55.453 回答
7

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

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

于 2012-03-28T12:13:53.320 回答
0

从硬件的角度来看,我想您会使用它-pipe来保持硬盘驱动器的使用寿命。

于 2009-10-03T09:04:48.600 回答