我正在开发一个多平台项目(MacOS、Linux 和 Windows),并且在尝试在 VS C++ 2010 中编译大型源文件时遇到了一些性能问题。
这里有一些背景知识。项目中有一个 .cpp 文件,大小为 800KB。文件的大小是由于我正在编译一个包含图像信息的数组而引起的。所以,这是一个巨大的无符号字符数组,无法拆分。
最近几个月我一直在MacOS上工作,所以直到几天前我才注意到这个问题。在 MacOS 和 Linux 中,gcc 会在一秒钟左右编译文件,但当我使用 VC++ 时,大约需要一个小时。
一开始我以为是电脑本身造成的,因为它速度不快。但后来我在同一台机器上尝试了 Cygwin 和 GCC 4,编译时间几乎和 MacOS 一样快。所以我必须假设问题是由 VC++ 2010 中的某些内容引起的。
我没有以任何形式调整过 VC++。项目文件是由CMake生成的,所以我相信这里应该有一些优化的空间。任何帮助将不胜感激。
您是否有机会将这个大数组放入单独的资源文件中并以这种方式读取它? 如果该数组确实是问题所在,这就是我解决此问题的方法。 如果做不到这一点,我会将数组放在自己的文件中,这样它就不会经常重新编译。
在解析数组初始值设定项时,VC++ 中似乎有一些 O(n^k) 部分 k>1...
这将是一个逻辑错误,你无能为力,但可能起作用的是
unsigned char bdata[][100] = {
{ 0x01, 0x02, ... , 0x63} ,
{ 0x64, 0x65, ... , 0xC7} ,
{ 0xC8, 0xC9, ... , 0x2B} ,
...
};
unsigned char *data = &(bdata[0][0]);
这会破坏 100 字节行中的数据... 可能是 这将由 VC 解析/编译得更快(只是怀疑我已经给出了症状),并且它不应该对您的构建过程产生太大影响.
我没有使用VC++2010所以无法检查。
请注意,在这种情况下,sizeof(data) 只是指针的大小,而 sizeof(bdata) 将是图像的大小,但四舍五入为行大小的倍数。
如果这个版本以相同的速度运行,不幸的是代码的字节数是 O(n^k),如果你想将其编译为数组,你基本上就注定失败了。
另一种选择可能是使用巨大的字符串文字...编译器可能会在这方面工作得更好(可能他们为字符串文字编写了特殊的代码路径,因为“大”文字并不罕见),但是您的代码生成器必须处理特殊字符的转义。