TTCN3新执行器系列-说说C++的编译速度
来源:互联网 发布:淘宝有仿大牌吗 编辑:程序博客网 时间:2024/06/06 07:34
无意在博客园milo的blog中看到,
http://www.cnblogs.com/miloyip/archive/2010/09/17/behind_cplusplus.html
最开始的C++编译器,是将C++代码转换成C代码,使用C编译器来实现的。
这个没有具体考究,但听起来是很可信的。
因为,C++是从C发展起来的,也就是所谓的c with class,
当时C++的语言特性还是很简单的,基于语言翻译来做完全是可行且不会特复杂的。
正由此想到我们花了2年时间做的TTCN3新执行器,将高级脚本语言翻译成C++,然后基于通用的C++编译器实现。
关于为什么选择C++而非C或者JAVA,这里面有多个理由的。
譬如为了项目旧版本的组件前向兼容,项目组C++开发人员的配备,C++的抽象能力和运行性能等等。
这一切看起来都是那么的无可挑剔,但恰恰缺乏对C++编译速度的警惕。
当然,ttcn3是一种高级的脚本语言,且产品线的测试套代码量巨大(10W到20W行是正常的),
当一种高级语言映射到较低级的C++语言时,转换代码比率能控制在几倍是有很大难度的。
也就是,我们的新执行器,面对的往往是几十万级别的C++代码工程!
这个编译速度(暂不算转换速度了)大家是可以遇见的,无论是全编译还是增量编译都是一个极具挑战的任务。
于是,杯具来了,我们需要控制编译速度在二次开发人员可接受的范围内。
什么是可接受范围?
如果你面对这样动辄几十万的工程,你认为你可接受的编译时间是多少?
当然,我们承认,我们的新执行器是有很大的改进空间的,C++的编译速度也不至于那么糟糕。
但很明白的是,对比C来说,C++的速度也确实很慢的。
我们有一个基于C实现的codec编码器,对10万行的asn1操作也花不了10来秒,数据是很有说服力的。
接下来,重构的工作集中在:
1、优化代码转换比率,最大限度利用C++抽象能力,把转换代码封装到库中实现。
2、最小化模板使用。
3、最小化内联函数使用。
4、最小化文件间的依赖(类前向声明),加快增量编译时间。
于是,每一次的优化,编译性能都是有提升的,
从10个小时,到2个小时,到45分钟,到15分钟,到最后的3分钟。。。
全编译的时间能控制的比较好了,但还是解决不了增量编译时间啊。
鉴于C++是编译+链接方式的,特别对于大工程,链接的时间也比较恐怖,
随便改动个cpp文件(我已经不考虑改动h文件导致的潜在惊群编译了),链接完也得花上30秒,生成个30M的dll库。
对用户来说,30秒怎么也不像个友好的体验~
PS,这哥们的总结还是很到位的,具体到我的项目还是有部分不适用,但大部分都很ok!
《如何加快C++代码的编译速度的几种技巧 》
http://www.cnblogs.com/vacuum/archive/2010/03/08/1681085.html
- TTCN3新执行器系列-说说C++的编译速度
- TTCN3新执行器系列-说说基于TTCN3代码行的调试器实现
- TTCN3新执行器系列-对component的理解
- TTCN3新执行器系列-实现简单的反射机制
- TTCN3新执行器系列-序
- TTCN3新执行器系列-实现类型兼容问题
- TTCN3新执行器系列-合理映射runson语义
- TTCN3新执行器系列-尽量远离template
- TTCN3新执行器系列-对线程组件PTC的理解
- TTCN3新执行器系列-谈谈几次伤筋动骨的重构工作
- TTCN3新执行器系列-端口操作的接口简单化重构
- TTCN3新执行器系列-如何最小化类的成员函数(对拷贝构造和赋值操作函数的反思)
- 自定义C结构,一种新的提高ruby代码执行速度的方法:cplusruby
- TTCN3本身的类型
- C编译执行的过程
- IntelliJ IDEA 12 新的编译模式:速度快一倍
- 如何加快C++代码的编译速度
- C语言编译执行的全过程
- 插入排序
- freetype2中英文对照教程
- Unix和Linux区别和联系
- 走火入魔.NET权限组件-用树型资源权限(数据集权限)思想来权限递归问题
- FreeType2的简单使用:平台无关的TrueType字体显示。
- TTCN3新执行器系列-说说C++的编译速度
- Linux下共享库的理解
- Ubuntu8.10设置静态IP地址
- 我是菜鸟
- 论工作计划
- FreeType 2开发文档 [中译版]
- freetype2 tutorial 中译版
- Oracle管道函数
- 走火入魔.NET权限组件-用资源权限(设置权限)思想来解来解决权限的存储问题