3

我正在尝试找到获取 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 倍。

4

3 回答 3

1

您正在重复处理相同的源文件 ( <windows.h>),这反过来又会引入许多其他文件。它<windows.h>位于默认的 SDK 目录中。

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

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

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

于 2010-12-21T16:05:07.103 回答
-1

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

于 2010-12-21T15:26:54.683 回答
-2

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

于 2010-12-21T15:48:07.033 回答