1. 关于c++编译生成文件
APS:存放二进制资源的中间文件,VC把当前资源文件转换成二进制格式,并存放在APS文件中,以加快资源装载速度。资源辅助文件。
.BMP:位图资源文件。
.BSC:浏览信息文件,由浏览信息维护工具(BSCMAKE)从原始浏览信息文件(.SBR)中生成,BSC文件可以用来在源代码编辑窗口中进行快速定位。用于浏览项目信息的,如果用source brower的话就必须有这个文件。可以在project options里去掉Generate Browse Info File,这样可以加快编译进度。
.C:用C语言编写的源代码文件。
.CLW:ClassWizard生成的用来存放类信息的文件。classwizard信息文件,ini文件的格式。
.CNT:用来定义帮助文件中“Contents”的结构。
.CPP或.CXX:用C++语言编写的源代码文件。
.CUR:光标资源文件。
.DEF:模块定义文件,供生成动态链接库时使用。
.DLG:定义对话框资源的独立文件。这种文件对于VC工程来说并非必需,因为VC一般把对话框资源放在.RC资源定义文件中。
.DSP:VC开发环境生成的工程文件,VC4及以前版本使用MAK文件来定义工程。项目文件,文本格式。
.DSW:VC开发环境生成的WorkSpace文件,用来把多个工程组织到一个WorkSpace中。工作区文件,与.dsp差不多。
.EXP:由LIB工具从DEF文件生成的输出文件,其中包含了函数和数据项目的输出信息,LINK工具将使用EXP文件来创建动态链接库。只有在编译DLL时才会生成,记录了DLL文件中的一些信息。
.H、.HPP或.HXX:用C/C++语言编写的头文件,通常用来定义数据类型,声明变量、函数、结构和类。
.HLP:Windows帮助文件。
.HM:在Help工程中,该文件定义了帮助文件与对话框、菜单或其它资源之间ID值的对应关系。
.HPJ:由Help Workshop生成的Help工程文件,用来控制Help文件的生成过程。
.HPG,生成帮助的文件的工程。
.ICO:图标资源文件。
.ILK:连接过程中生成的一种中间文件,只供LINK工具使用。
.INI:配置文件。
.LIB:库文件,LINK工具将使用它来连接各种输入库,以便最终生成EXE文件。
.LIC:用户许可证书文件,使用某些ActiveX控件时需要该文件。
.MAK:即MAKE文件,VC4及以前版本使用的工程文件,用来指定如何建立一个工程,VC6把MAK文件转换成DSP文件来处理。
.MAP:由LINK工具生成的一种文本文件,其中包含有被连接的程序的某些信息,例如程序中的组信息和公共符号信息等。执行文件的映像信息记录文件。
.MDP:旧版本的项目文件,相当于.dsp
.NCB:NCB是“No Compile Browser”的缩写,其中存放了供ClassView、WizardBar和Component Gallery使用的信息,由VC开发环境自动生成。无编译浏览文件。当自动完成功能出问题时可以删除此文件。编译工程后会自动生成。
.OBJ:由编译器或汇编工具生成的目标文件,是模块的二进制中间文件。
.ODL:用对象描述语言编写的源代码文件,VC用它来生成TLB文件。
.OLB:带有类型库资源的一种特殊的动态链接库,也叫对象库文件。
.OPT:VC开发环境自动生成的用来存放WorkSpace中各种选项的文件。工程关于开发环境的参数文件。如工具条位置信息等。
.PBI、.PBO和.PBT:由VC的性能分析工具PROFILE生成并使用的三种文件。
.PCH:预编译头文件,比较大,由编译器在建立工程时自动生成,其中存放有工程中已经编译的部分代码,在以后建立工程时不再重新编译这些代码,以便加快整个编译过程的速度。
.PDB:程序数据库文件,在建立工程时自动生成,其中存放程序的各种信息,用来加快调试过程的速度。记录了程序有关的一些数据和调试信息。
.PLG:编译信息文件,编译时的error和warning信息文件。
.RC:资源定义文件。
.RC2:资源定义文件,供一些特殊情况下使用。
.REG:注册表信息文件。
.RES:二进制资源文件,资源编译器编译资源定义文件后即生成RES文件。
.RTF:Rich Text Format(丰富文本格式)文档,可由Word或写字板来创建,常被用来生成Help文件。
.SBR:VC编译器为每个OBJ文件生成的原始浏览信息文件,浏览信息维护工具(BSCMAKE)将利用SBR文件来生成BSC文件。
.TLB:OLE库文件,其中存放了OLE自动化对象的数据类型、模块和接口定义,自动化服务器通过TLB文件就能了解自动化对象的使用方法。
debug 包里面有生成的可执行文件,及有关链接库的一些信息,调试信息等
2. 如何提高ISE的编译速度
如果你的cpu够强你应该学会如何利用好它来加速你的代码编译速度,那么你怎么才能够最大限度让你的cpu发烧呢?
下面是一个对比:
比如我的cpu是i7 3770k,
编译cocos2d-x的libcocos2d工程:
不优化:
1>Time Elapsed 00:01:35.25
优化后:
1>Time Elapsed 00:00:21.66
效果显着!!!
参考网页:
Visual Studio 2010中C++并行构建调优(1)
http://developer.51cto.com/art/201003/189235.htm
1>cl : Command line warning D9030: '/Gm' is incompatible with multiprocessing; ignoring /MP switch
解决办法是:
Properties -> Configuration Properties -> C/C++ -> Code Generation -> Enable Minimal Rebuild -> No(/Gm-)
Properties -> Configuration Properties -> C/C++ -> Geneal -> Multi-processor Compilation -> Yes(/MP)
一些含义和拓展资料:
Enable minimal rebuild
通过保存关联信息到.IDB文件,使编译器只对最新类定义改动过的源文件进行重编译,提高编译速度
Enable Incremental Compilation
同样通过.IDB文件保存的信息,只重编译最新改动过的函数
/MP (Build with Multiple Processes)
http://msdn.microsoft.com/en-us/library/bb385193.aspx
/Gm (Enable Minimal Rebuild)
http://msdn.microsoft.com/en-us/library/kfz8ad09.aspx
3. Xcode 构建速度优化(一)衡量编译时间
随着项目不断迭代,工程文件越来越多,引用的三方库也越来越多,这些直接导致编译时间的不断增加,完整编译一次项目动辄需要五分钟以上时间,实在有些影响开发效率,是时候来一波提速了。
为编译和构建提速,首先我们需要对速度有一个衡量标准:准确获得构建用时
首先,我们需要定义要衡量和优化的内容。 有两种选择:
xcode默认情况下会跟踪所有构建,我们可以通过更改xcode相关设置,来在活动查看器中显示出构建时间,通过命令行:
每次编译成功后,会在Successed之后显示出所用时间:
Xcode Build Timing Summary是Xcode10中加入的用于查看获取构建时间和发现用时瓶颈方面的最有利工具。 可以通过Proct->Perform Action->Build With Timing Summary来开启:这样在 Build Log 的末尾就会添加 Timing Summary Log。我们可以通过这个 log 看到哪个阶段是耗时的,便于我们进行优化。
如上图中: xib阶段的编译耗时明显是比普通c文件要多的,意味着我们可以通过减少xib方式来优化提升速度
而c文件的编译用时比总时间还要长,是因为c文件是并行编译的
在命令行中同样可以开启这个功能:
常用的第三方工具有 BuildTimeAnalyzer 、 xcode-build-times-rendering 、 XCLogParser 。
BuildTimeAnalyzer可以统计可以得出某个文件的类型检查时长,每个表达式的类型检查时长。
xcode-build-times-rendering是一个Ruby编写的第三方工具,可以方便地分别测量目标的构建时间并在图表上显示它们,使用gem安装
接下来使用这个工具自带命令配置项目
然后构建项目并生成报告:
这个工具使用上比较简单,缺点是只能从宏观上生成各个target编译的整体图标,无法详细列出各个内部编译明细
XCLogParser可以详细列出各个Target和内部每个文件的编译耗时,对我们分析编译时间瓶颈非常有帮助,它的工作原理主要是做为解析器,通过解析xcode编译生成的xcactivitylog日志来记录
安装:
编译项目后,进行安装
安装成功后通过命令:
会自动在当前目录的 build/xclogparser/reports/ 路径下生成报告,其中--project参数需要设置为待分析项目的名字,并注意当前在终端切换到希望写入日志的目录。
报告截图:
这个工具将作为我们后面分析提升编译构建速度的主要使用工具。
经过我多次在不同时间段,不同电脑上不断尝试编译,
我发现编译耗时是一个比较玄的东西,及时在同一台电脑,同一个项目, 同一套环境配置下,编译用时也会随着电脑当前状态(包括同时打开进程、散热等等)上下大幅跳动,就像算法时间复杂度一样,有时候我们明明做了一些细微的优化,但是结果反而是编译耗时增加了,这是很正常的事情
所以,衡量这个标准需要我们取多次试验中的平均值作为参考。
4. C语言多充循环,运算次数多,编译时间很长,又无法估计最终需要多久,怎么办
如果要减少时间 那么优化代码,或者直接改进算法
如果要预测时间,那么大致估计一下循环的次数,然后在固定的某个循环中加一个打印,通过打印频率来估算总时间
项目越来越大,每次需要重新编译整个项目都是一件很浪费时间的事情。Research了一下,找到以下可以帮助提高速度的方法,总结一下。
1. 使用tmpfs来代替部分IO读写
2.ccache,可以将ccache的缓存文件设置在tmpfs上,但是这样的话,每次开机后,ccache的缓存文件会丢失
3.distcc,多机器编译
4.将屏幕输出打印到内存文件或者/dev/null中,避免终端设备(慢速设备)拖慢速度。
tmpfs
有人说在Windows下用了RAMDisk把一个项目编译时间从4.5小时减少到了5分钟,也许这个数字是有点夸张了,不过粗想想,把文件放到内存上做编译应该是比在磁盘上快多了吧,尤其如果编译器需要生成很多临时文件的话。
这个做法的实现成本最低,在Linux中,直接mount一个tmpfs就可以了。而且对所编译的工程没有任何要求,也不用改动编译环境。
mount -t tmpfs tmpfs ~/build -o size=1G
用2.6.32.2的Linux Kernel来测试一下编译速度:
用物理磁盘:40分16秒
用tmpfs:39分56秒
呃……没什么变化。看来编译慢很大程度上瓶颈并不在IO上面。但对于一个实际项目来说,编译过程中可能还会有打包等IO密集的操作,所以只要可能,用tmpfs是有益无害的。当然对于大项目来说,你需要有足够的内存才能负担得起这个tmpfs的开销。
make -j
既然IO不是瓶颈,那CPU就应该是一个影响编译速度的重要因素了。
用make -j带一个参数,可以把项目在进行并行编译,比如在一台双核的机器上,完全可以用make -j4,让make最多允许4个编译命令同时执行,这样可以更有效的利用CPU资源。
还是用Kernel来测试:
用make: 40分16秒
用make -j4:23分16秒
用make -j8:22分59秒
由此看来,在多核CPU上,适当的进行并行编译还是可以明显提高编译速度的。但并行的任务不宜太多,一般是以CPU的核心数目的两倍为宜。
不过这个方案不是完全没有cost的,如果项目的Makefile不规范,没有正确的设置好依赖关系,并行编译的结果就是编译不能正常进行。如果依赖关系设置过于保守,则可能本身编译的可并行度就下降了,也不能取得最佳的效果。
ccache
ccache工作原理:
ccache也是一个编译器驱动器。第一趟编译时ccache缓存了GCC的“-E”输出、编译选项以及.o文件到$HOME/.ccache。第二次编译时尽量利用缓存,必要时更新缓存。所以即使"make clean; make"也能从中获得好处。ccache是经过仔细编写的,确保了与直接使用GCC获得完全相同的输出。
ccache用于把编译的中间结果进行缓存,以便在再次编译的时候可以节省时间。这对于玩Kernel来说实在是再好不过了,因为经常需要修改一些Kernel的代码,然后再重新编译,而这两次编译大部分东西可能都没有发生变化。对于平时开发项目来说,也是一样。为什么不是直接用make所支持的增量编译呢?还是因为现实中,因为Makefile的不规范,很可能这种“聪明”的方案根本不能正常工作,只有每次make clean再make才行。
安装完ccache后,可以在/usr/local/bin下建立gcc,g++,c++,cc的symbolic link,链到/usr/bin/ccache上。总之确认系统在调用gcc等命令时会调用到ccache就可以了(通常情况下/usr/local /bin会在PATH中排在/usr/bin前面)。
安装的另外一种方法:
vi ~/.bash_profile
把/usr/lib/ccache/bin路径加到PATH下
PATH=/usr/lib/ccache/bin:$PATH:$HOME/bin
这样每次启动g++的时候都会启动/usr/lib/ccache/bin/g++,而不会启动/usr/bin/g++
效果跟使用命令行ccache g++效果一样
这样每次用户登录时,使用g++编译器时会自动启动ccache
继续测试:
用ccache的第一次编译(make -j4):23分38秒
用ccache的第二次编译(make -j4):8分48秒
用ccache的第三次编译(修改若干配置,make -j4):23分48秒
看来修改配置(我改了CPU类型...)对ccache的影响是很大的,因为基本头文件发生变化后,就导致所有缓存数据都无效了,必须重头来做。但如果只是修改一些.c文件的代码,ccache的效果还是相当明显的。而且使用ccache对项目没有特别的依赖,布署成本很低,这在日常工作中很实用。
可以用ccache -s来查看cache的使用和命中情况:
cache directory /home/lifanxi/.ccachecache hit 7165cache miss 14283called for link 71not a C/C++ file 120no input file 3045files in cache 28566cache size 81.7 Mbytesmax cache size 976.6 Mbytes
可以看到,显然只有第二编次译时cache命中了,cache miss是第一次和第三次编译带来的。两次cache占用了81.7M的磁盘,还是完全可以接受的。
distcc
一台机器的能力有限,可以联合多台电脑一起来编译。这在公司的日常开发中也是可行的,因为可能每个开发人员都有自己的开发编译环境,它们的编译器版本一般是一致的,公司的网络也通常具有较好的性能。这时就是distcc大显身手的时候了。
使用distcc,并不像想象中那样要求每台电脑都具有完全一致的环境,它只要求源代码可以用make -j并行编译,并且参与分布式编译的电脑系统中具有相同的编译器。因为它的原理只是把预处理好的源文件分发到多台计算机上,预处理、编译后的目标文件的链接和其它除编译以外的工作仍然是在发起编译的主控电脑上完成,所以只要求发起编译的那台机器具备一套完整的编译环境就可以了。
distcc安装后,可以启动一下它的服务:
/usr/bin/distccd --daemon --allow 10.64.0.0/16
默认的3632端口允许来自同一个网络的distcc连接。
然后设置一下DISTCC_HOSTS环境变量,设置可以参与编译的机器列表。通常localhost也参与编译,但如果可以参与编译的机器很多,则可以把localhost从这个列表中去掉,这样本机就完全只是进行预处理、分发和链接了,编译都在别的机器上完成。因为机器很多时,localhost的处理负担很重,所以它就不再“兼职”编译了。
export DISTCC_HOSTS="localhost 10.64.25.1 10.64.25.2 10.64.25.3"
然后与ccache类似把g++,gcc等常用的命令链接到/usr/bin/distcc上就可以了。
在make的时候,也必须用-j参数,一般是参数可以用所有参用编译的计算机CPU内核总数的两倍做为并行的任务数。
同样测试一下:
一台双核计算机,make -j4:23分16秒
两台双核计算机,make -j4:16分40秒
两台双核计算机,make -j8:15分49秒
跟最开始用一台双核时的23分钟相比,还是快了不少的。如果有更多的计算机加入,也可以得到更好的效果。
在编译过程中可以用distccmon-text来查看编译任务的分配情况。distcc也可以与ccache同时使用,通过设置一个环境变量就可以做到,非常方便。
总结一下:
tmpfs: 解决IO瓶颈,充分利用本机内存资源
make -j: 充分利用本机计算资源
distcc: 利用多台计算机资源
ccache: 减少重复编译相同代码的时间
这些工具的好处都在于布署的成本相对较低,综合利用这些工具,就可以轻轻松松的节省相当可观的时间。上面介绍的都是这些工具最基本的用法,更多的用法可以参考它们各自的man page。
5.还有提速方法是把屏幕输出重定向到内存文件或/dev/null,因对终端设备(慢速设备)的阻塞写操作也会拖慢速度。推荐内存文件,这样发生错误时,能够查看。
6. 关于如何提高keil的编译速度
Project -> Options for Target -> C/C++下面勾选“Optimize for Time”优化时间,即优化代码中费时的地方。
Keil(MDK-ARM)系列教程(四)_工程目标选项配置(Ⅱ):
http://blog.csdn.net/ybhuangfugui/article/details/53131141
Keil系列教程:
http://blog.csdn.net/column/details/13472.html
7. 如何加快xcode编译速度
1. 增加XCode执行的线程数
可以根据自己Mac的性能,更改线程数设置5:defaults write com.apple.Xcode 5
另外也有一个设置可以开启:defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES
XCode默认使用与CPU核数相同的线程来进行编译,但由于编译过程中的IO操作往往比CPU运算要多,因此适当的提升线程数可以在一定程度上加快编译速度。
2.将Debug Information Format改为DWARF
在工程对应Target的Build Settings中,找到Debug Information Format这一项,将Debug时的DWARF with dSYM file改为DWARF。
这一项设置的是是否将调试信息加入到可执行文件中,改为DWARF后,如果程序崩溃,将无法输出崩溃位置对应的函数堆栈,但由于Debug模式下可以在XCode中查看调试信息,所以改为DWARF影响并不大。这一项更改完之后,可以大幅提升编译速度。
比如在目前本人负责的项目中,由于依赖了多个Target,所以需要在每个Target的Debug Information Format设置为DWARF。顺便提一下,如果通过Cocoapod引入第三方则Debug Information Format默认就是设置为DWARF的。
SDWebImage通过Cocoapod``Debug Information Format的默认设置
注意:将Debug Information Format改为DWARF之后,会导致在Debug窗口无法查看相关类类型的成员变量的值。当需要查看这些值时,可以将Debug Information Format改回DWARF with dSYM file,clean(必须)之后重新编译即可。
3.将Build Active Architecture Only改为Yes
在工程对应Target的Build Settings中,找到Build Active Architecture Only这一项,将Debug时的NO改为Yes。
664334-fa1eb995c140ce0f.png
这一项设置的是是否仅编译当前架构的版本,如果为NO,会编译所有架构的版本。需要注意的是,此选项在Release模式下必须为NO`,否则发布的ipa在部分设备上将不能运行。这一项更改完之后,可以显着提高编译速度。
4.设计编译优化等级
不要再项目中或者静态库中使用-O4,因为这会让Clang链接Link Time Optimizations (LTO)使得编译更慢,通常使用-O3。
注意:在设置编译优化之后,XCode断点和调试信息会不正常,所以一般静态库或者其他Target这样设置。
4.资源整合
4.1 将常用的代码及文件打包成静态库
4.2 添加预编译文件,把常用的头文件放到预编译文件里面
4.3 能用@class就用@class
8. c++builder编译速度太慢,能不能通过设置来加快
C++builder是最快的C++编译器之一,从编译速度来说也可以说是最快的win32C++编译器了。除了速度之外,C++builder的性能也在其它C++编译器的之上,但许多delphi程序员仍受不了c++builder工程的编译速度。的确,delphi的速度要比任和c++的编译器都要快好多。Delphi在编译一个小工程的时候可能不到一秒,大的工程一般也在5秒钟这内编译完成了。
为什么delphi会比c++builder快这么多?是否有方法来c++builder的编译速度?本文就讲解了为什么C++的编译器速度会慢,并且介绍了一个简单的方法来减少c++builder的编译时间。
为什么c++编译器的速度会慢?
c++builder 使用者怎么通过预编译头文件来减少编译时间?
讲解基于VCL可视化工程的预编译头文件方法
优化c++builder对预编译头文件的使用
结论
注意事项
为什么c++编译器速度慢?
在C++中,你只能使用预定义或是预先声明了的函数,这意味什么?来看一个简单的例子,函数A()调用函数B(),函数A()只能在函数B()的原型或是函数体在A()之前才能调用它