Performance VC++;编译时间和性能 我正在研究一个多重形式项目(MaOS,Linux和Windows),在编译VS C++ 2010中的一个大的源文件时,我一直有一些性能问题。

Performance VC++;编译时间和性能 我正在研究一个多重形式项目(MaOS,Linux和Windows),在编译VS C++ 2010中的一个大的源文件时,我一直有一些性能问题。,performance,optimization,visual-c++,compiler-construction,Performance,Optimization,Visual C++,Compiler Construction,这里有一点背景。项目中有一个800KB大的.cpp文件。文件的大小是由于我正在编译一个包含图像信息的数组。所以,它是一个巨大的无符号字符数组,不能拆分 在过去的几个月里,我一直在研究MacOS,所以直到几天前我才注意到这个问题。在MacOS和Linux中,gcc都能在一秒钟左右的时间内编译文件,但当我使用VC++时,大约需要一个小时 起初我认为这是电脑本身造成的,因为它速度不快。但后来我在同一台机器上尝试了Cygwin和GCC4,编译时间几乎和MacOS一样快。所以我必须假设这个问题是由VC++

这里有一点背景。项目中有一个800KB大的.cpp文件。文件的大小是由于我正在编译一个包含图像信息的数组。所以,它是一个巨大的无符号字符数组,不能拆分

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

起初我认为这是电脑本身造成的,因为它速度不快。但后来我在同一台机器上尝试了Cygwin和GCC4,编译时间几乎和MacOS一样快。所以我必须假设这个问题是由VC++2010中的某些东西引起的

我没有用过任何形式的tweek VC++。项目文件是由CMake生成的,所以我认为这里应该有一些优化的空间。任何帮助都将不胜感激

谢谢


Hernan

您有没有可能将那个大数组放到一个单独的资源文件中,并以这种方式读取它?如果这个数组确实是问题所在,那么我就会这样着手解决这个问题。如果做不到这一点,我会将数组放在它自己的文件中,这样它就不会经常重新编译。

有没有可能将这个大数组放在一个单独的资源文件中,并以这种方式读取它?如果这个数组确实是问题所在,那么我就会这样着手解决这个问题。如果做不到这一点,我会将数组放在它自己的文件中,这样它就不会经常重新编译。

在解析数组初始值设定项时,看起来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),如果你想把它编译成一个数组,那么你基本上是注定要失败的

另一个选择可能是使用一个巨大的字符串文字。。。编译器可能在这方面工作得更好(可能他们为字符串文本编码了一个特殊的代码路径,因为“大”文本并不少见),但您的代码生成器必须处理特殊字符的转义。

在解析数组初始值设定项时,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),如果你想把它编译成一个数组,那么你基本上是注定要失败的


另一个选择可能是使用一个巨大的字符串文字。。。编译器可能在这方面工作得更好(可能他们为字符串文字编码了特殊的代码路径,因为“大”文字并不少见),但您的代码生成器必须处理特殊字符的转义。

我有一个2.4MB大小的cpp,其中包含几十个与您类似的数组。大多数都很小(比如5kb),但最大的是400kb。与VS 2008和2010相比,它只需1-2秒即可编译。我假设您有一个不同的问题。我有一个2.4MB大小的cpp,它包含几十个与您类似的阵列。大多数都很小(比如5kb),但最大的是400kb。与VS 2008和2010相比,它只需1-2秒即可编译。我想你有不同的问题。