我正在尝试找到获取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倍。
答案 0 :(得分:1)
您反复处理相同的源文件(<windows.h>
),而后者又会提取大量其他文件。此<windows.h>
位于默认的SDK目录中。
现在,处理这个不变的文件需要花费很多时间。然而,你可以依靠它而不是改变它 - 毕竟它是公共界面的一部分。因此,您可以预处理它 - 例如删除注释 - 并将该版本传递给cl /EP
。
当然,这通常是一个I / O绑定任务,但是有一个重要的CPU部分混合在一起。并行处理多个源的方法将有助于总吞吐量。测量单一来源的预处理时间并不太重要。
最后,测量将输出写入NUL
的时间。您不应该包括将mini.i
写入磁盘所需的时间,因为您打算将输出通过管道传输到md5sum
。
答案 1 :(得分:-1)
您可以使用文件项目设置的预处理。此外,一些较新的MSVC版本提供多线程编译。
答案 2 :(得分:-1)
/ P选项已存在多年,它会创建.i文件,而不会创建目标文件。