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

Visual c++ 使用MSVC获取预处理源代码的最快方法是什么?,visual-c++,c-preprocessor,ccache,Visual C++,C Preprocessor,Ccache,我正试图找到最快的方法来获取C源文件的完整预处理源代码(我不需要其他注释的行信息,只需要原始源代码) 我有下面的小测试程序,它只包含Windows头文件(mini.c): 生成2.5MB mini.i文件需要6秒钟;将此更改为 cl /nologo /EP mini.c > mini.i (跳过注释和行信息)只需0.5秒即可写入2.1MB的输出 有人知道在不使用预编译头的情况下进一步改进这一点的好技术吗 我问的原因是我为MSVC编写了一个流行工具的变体。作为工作的一部分,程序需要计算预处

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

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

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

cl /nologo /EP mini.c > mini.i
(跳过注释和行信息)只需0.5秒即可写入2.1MB的输出

有人知道在不使用预编译头的情况下进一步改进这一点的好技术吗

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

也许有一个专用的预处理器二进制文件可用,或者其他命令行开关可能会有所帮助


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

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

该/p选项已经存在多年,它创建了.i文件,而没有对象文件。

您重复处理相同的源文件(
),这反过来又会拉入许多其他文件。此
位于默认SDK目录中

现在,处理这个不变的文件需要很长时间。但是你可以相信它不会改变——毕竟它是公共界面的一部分。因此,您可以对其进行预处理—例如,去掉注释—并将该版本传递给
cl/EP

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


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

我似乎无法将
cl/EP
写入
NUL
。我很清楚编译器的参数,多线程编译对我没有帮助,因为我实际上没有编译任何东西。我只是运行预处理器。
cl /nologo /P mini.c
cl /nologo /EP mini.c > mini.i