一种 VC release 编译极慢的原因和解决办法
2017-01-18 17:31
274 查看
问题描述:
本人使用的是 Visual C++ 2008 。一直使用正常。
最近发现项目在 release 时编译极慢,要6~10分钟不等,无法忍受。
在慢的时候,输出窗口显示“正在生成代码”。
原因分析:
调试了各种编译选项,均不奏效。
后来分析代码,发现问题出现在某个特定的 cpp.
这个 cpp 的独特之处在于有一个很大的字节数组的常量初始化。
例如
char a[ ] = { 0x11, 0x12, 0x15 };
在我的源码中,这句话的特别之处在于初始化的数据特别长,有26k。
为了让源码看起来方便,我把数据部分放到了一个独立的 txt 中,并用
include 引入到 cpp中。看起来是这样的。
在 data.txt 中
在 cpp 中
在 Debug 模式下,编译速度正常,但在 Release 模式下就很慢。
若将 #include "data.txt" 改成一个数,则 Release 模式下的编译速度恢复正常。
因此判断编译速度慢的原因可能是 Release 模式下,编译器尝试优化代码,而包含了 data.txt 的 cpp 代码极长,优化程序为分析代码而消耗大量时间。 Debug 模式之所以编译速度正常是因为 Debug 模式没有对代码进行优化。
解决方案:
鉴于以上分析,解决的办法就是关闭优化。但是,在整个项目关闭优化会降低程序的运行性能,若能仅在涉及到 data.txt 的部分临时关闭优化就好了。
经查, 预编译指令 #pragma optimiz( "") off 可以达此目的。
因此,最终的解决方案就是在包含 #include "data.txt" 的函数之前加上和之后分别加上 #pragma optimiz("") off 和 on.
代码如下:
表示在编译这个函数时,临时关闭所有编译优化选项,在这个函数后则恢复编译优化选项。
本人使用的是 Visual C++ 2008 。一直使用正常。
最近发现项目在 release 时编译极慢,要6~10分钟不等,无法忍受。
在慢的时候,输出窗口显示“正在生成代码”。
原因分析:
调试了各种编译选项,均不奏效。
后来分析代码,发现问题出现在某个特定的 cpp.
这个 cpp 的独特之处在于有一个很大的字节数组的常量初始化。
例如
char a[ ] = { 0x11, 0x12, 0x15 };
在我的源码中,这句话的特别之处在于初始化的数据特别长,有26k。
为了让源码看起来方便,我把数据部分放到了一个独立的 txt 中,并用
include 引入到 cpp中。看起来是这样的。
在 data.txt 中
0x11, 0x10, 0x7F, 0x8A, ..... ....... 0xAB, 0x3D
在 cpp 中
char a[] = { #include "data.txt" };
在 Debug 模式下,编译速度正常,但在 Release 模式下就很慢。
若将 #include "data.txt" 改成一个数,则 Release 模式下的编译速度恢复正常。
因此判断编译速度慢的原因可能是 Release 模式下,编译器尝试优化代码,而包含了 data.txt 的 cpp 代码极长,优化程序为分析代码而消耗大量时间。 Debug 模式之所以编译速度正常是因为 Debug 模式没有对代码进行优化。
解决方案:
鉴于以上分析,解决的办法就是关闭优化。但是,在整个项目关闭优化会降低程序的运行性能,若能仅在涉及到 data.txt 的部分临时关闭优化就好了。
经查, 预编译指令 #pragma optimiz( "") off 可以达此目的。
因此,最终的解决方案就是在包含 #include "data.txt" 的函数之前加上和之后分别加上 #pragma optimiz("") off 和 on.
代码如下:
#pragma ("") off void f() { char a[] = { #include "data.txt" }; ....// something else. } #pragma ("") on
表示在编译这个函数时,临时关闭所有编译优化选项,在这个函数后则恢复编译优化选项。
相关文章推荐
- 在VC6下编译MTL程序,出现的C4786错误的原因和解决办法
- 程序Debuge版本编译通过,Release版本出现链接错误,解决办法
- VC++ 6.0 Debug 正常 Release出错 解决办法
- VC经典的编译错误解决办法(转载)
- VC经典的编译错误解决办法(转载)
- 数据库莫名变慢的一种可能原因和解决办法.
- eclipse无法自动编译的原因解决办法
- VC++ 6.0 Build配置中没有Release的解决办法
- [VC++]编译,没有找到 mspdb80.dll 的解决办法
- QT4的FindDialog例子在VC6中编译时提示链接错误的一种直观的解决办法(包含过程思路)
- [VC++]编译,没有找到 mspdb80.dll 的解决办法
- VC编译错误fatal error C1083的解决办法
- vc编译报错 unresolved external symbol __imp__PlaySoundA@12 解决办法
- 64位系统上设置编译平台为x86的VS2008项目升级到VS2010后编译失败的原因和解决办法
- VC++ 6.0 链接错误 ”LNK2001“原因及解决办法
- VC编译程序错误Error spawning的解决办法
- vc++6源码在VC2010中编译提示iostream.h库找不到问题的解决办法
- 我把一个VC6的工程转换为VS2008的工程后,编译总是出现找不到而且不能升级vc90.pdb文件的问题,error C2471--解决办法
- VC中Debug和Release出错的问题解决办法
- vc编译报错 unresolved external symbol __imp__PlaySoundA@12 解决办法