1

我工作的一个multiplaform项目(MacOS的,Linux和Windows),并试图编译VS C++ 2010VC++的编译时间和性能

这是一个很大的源文件时,我一直有一些性能问题一点背景。项目中有一个.cpp文件,大小为800KB。该文件的大小是由于我正在编译包含图像信息的数组。所以,这是一个无法分割的巨大的无符号字符数组。

现在,我在最近几个月一直在研究MacOS,所以直到前几天我才注意到这个问题。在MacOS和Linux中,gcc都在一秒钟左右编译文件,但是当我使用VC++时,大约需要一个小时。

起初我虽然是由电脑本身,因为它不是一个快速的。但之后我在同一台机器上试用了Cygwin和GCC 4,编译时间几乎和MacOS一样快。所以我不得不假设问题是由VC++ 2010内的东西造成的。

我还没有以任何形式推荐VC++。项目文件由CMake生成,所以我相信在这里应该有一些优化空间。任何帮助将不胜感激。

谢谢。

埃尔南

+0

我有一个2.4MB大小的CPP,其中包含数十个类似于你的阵列。大多数是小的(如5kb),但最大的是400kb。 它与VS 2008和2010在1-2秒内编译。 我假设你有一个不同的问题。 – nusi 2010-07-01 21:07:28

回答

0

任何机会,你可以把那个大阵成一个单独的资源文件,并以这种方式读它?这就是我会如何解决这个问题,如果该阵列确实是问题。否则,我会把数组放在自己的文件中,这样它就不会经常重新编译。

0

看起来有一些ØVC的(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(数据)将只是指针的大小,sizeof(bdata)将取代图像的大小,但是四舍五入为行的大小的倍数

如果这个版本以相同的速度运行,遗憾的是代码的字节数是O(n^k),如果你想将它编译为一个数组,你基本上注定要失败。

另一个选择可能是使用巨大的字符串文字......编译器可能会更好地工作(可能是因为“大”文字不是很少见,它们编码字符串文字的特殊代码路径),但是您的代码生成器将不得不处理特殊字符的转义。