使用MSVC获取预处理源代码的最快方法是什么?

时间:2010-12-21 15:24:54

标签: visual-c++ c-preprocessor ccache

我正在尝试找到获取C源文件的完整预处理源代码(我不需要#line信息其他注释,只需原始源代码)的最快方法。

我有以下小测试程序,它只包含Windows头文件(mini.c):

#include <windows.h>

使用Microsoft Visual Studio 2005,然后运行此命令:

cl /nologo /P mini.c

生成2.5MB mini.i文件需要6秒钟;将此更改为

cl /nologo /EP mini.c > mini.i

(跳过评论和#line信息)只需0.5秒即可写入2.1MB的输出。

是否有人知道有更好的技术可以进一步改进,而不使用预编译的标题

我问的原因是我为MSVC编写了一个流行的ccache工具的变体。作为工作的一部分,程序需要计算预处理源代码(以及其他一些东西)的哈希值。我想尽快做到这一点。

也许有可用的专用预处理器二进制文件,或其他可能有用的命令行开关?

更新:我想到了一个想法:定义WIN32_LEAN_AND_MEAN宏来删除很多很少需要的代码。这使得上述预处理器的运行速度提高了大约3倍。

3 个答案:

答案 0 :(得分:1)

您反复处理相同的源文件(<windows.h>),而后者又会提取大量其他文件。此<windows.h>位于默认的SDK目录中。

现在,处理这个不变的文件需要花费很多时间。然而,你可以依靠它而不是改变它 - 毕竟它是公共界面的一部分。因此,您可以预处理它 - 例如删除注释 - 并将该版本传递给cl /EP

当然,这通常是一个I / O绑定任务,但是有一个重要的CPU部分混合在一起。并行处理多个源的方法将有助于总吞吐量。测量单一来源的预处理时间并不太重要。

最后,测量将输出写入NUL的时间。您不应该包括将mini.i写入磁盘所需的时间,因为您打算将输出通过管道传输到md5sum

答案 1 :(得分:-1)

您可以使用文件项目设置的预处理。此外,一些较新的MSVC版本提供多线程编译。

答案 2 :(得分:-1)

/ P选项已存在多年,它会创建.i文件,而不会创建目标文件。