【问题标题】:What is the fastest way to get just the preprocessed source code with MSVC?使用 MSVC 获取预处理源代码的最快方法是什么?
【发布时间】:2011-05-28 21:37:00
【问题描述】:

我正在尝试找到获取 C 源文件的完整预处理源代码(我不需要其他 cmets 的#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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您正在重复处理同一个源文件 (&lt;windows.h&gt;),这反过来又会引入许多其他文件。此&lt;windows.h&gt; 位于默认 SDK 目录中。

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

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

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

    【讨论】:

    • 我似乎无法让cl /EP 写信给NUL。它只是坐在那里无所事事。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我很清楚编译器参数,多线程编译对我没有帮助,因为我实际上并没有编译任何东西。我只是运行预处理器。
      猜你喜欢
      • 2013-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多