副标题#e#
摘 要 本文主要针对Intel C++ 9.0编译器在Visual C++ 6.0情况下对一些常用的成果性操纵的优化浸染举办了测试验证。主要从对回收编译器前后的措施运行时间举办较量来举办判定。测试范畴主要会合于对线程的切换时间,转异常以及异常规复时间,高优先级线程抢先时间以及信号量响应时间方面。另外,还对一些常用的数学函数的运行时间举办了测试较量。得出的测试数据和结论能对回收此编译器的用户有必然的参考代价和警惕浸染。
要害词 Intel C++,Visual C++,编译器,优化
引言
当今很多计较机应用规模,如天气预报、信号处理惩罚以及军事上的弹道跟踪等,它们对措施处理惩罚速度的要求都是相当高的。不然就会导致功效呈现毛病可能失去其意义。要提高措施的运算速度,一般通过以下几个方面的改造法子来举办:(1)回收新的处理惩罚速度更快的硬件设备,如更快的CPU,更大的内存,以及更快的I/O设备等。但这显然会导致本钱的大量增加,并非是一种适合于任何单元的实际的改造法子。(2)越发优化的措施设计要领,如在措施中引入多线程、并行等处理惩罚要领。这是一种较量有效的要领,虽然对措施设计人员以及编程人员的程度有更高的要求。(3)回收一些优化软件,这也是一种轻便有效的要领。别的假如和其他两种要领共同利用,对付一些要求大幅度提高处理惩罚速度的场所下,也将长短常有辅佐的。
回收优化型编译器就属于上面先容的第三种要领。处理惩罚器由于受数据相关、条件转移和资源斗嘴等原因,指令级并行度受到极大的限制。通过优化编译器对指令序罗列办重组,以及回收软件与硬件相团结的要领处理惩罚数据相关、条件转移和资源斗嘴等,可以大大提高处理惩罚器的指令级并行度,使在一按时间内可发射尽大概多的指令数。别的,优化编译器还能按照处理惩罚器中先行指令窗口的巨细,把没有数据相关、节制相关和成果部件斗嘴,可能斗嘴和相关较量少的指令调治到同一个先行指令窗口中,使这些指令逾越它前面的指令先发射到操纵部件中去,从而提高成果部件的操作率,这样就能进一步提高处理惩罚器的机能。
一般来讲,实现措施的优化调治需要软件(主要是编译器)和硬件的配合团结才气得到较量好的调治结果。Intel C++ 编译器作为一款专门针对Intel 型处理惩罚器举办优化的编译器,它们二者的团结从理论上能实现优化调治,能对措施的执行效能有某些方面和必然水平的提高。测试中处理惩罚器应选择Intel系列的产物,实际利用的处理惩罚器为Intel 奔驰4处理惩罚器(1.8GHZ),内存为256MB;操纵系统思量通用性和遍及性,为Windows XP系统,编程情况为Visual C++ 6.0。
线程特别开销测试
针对越来越多的多线程编程应用,线程间的开销诸如线程间的切换时间、高优先级线程的抢先时间以及线程对信号量的响应时间等指标成为制约措施执行速度的一个重要方面。淘汰线程的特别开销时间对提高措施的运行速度长短常有意义的。
1、测试指标
这里主要包罗四个测试指标,(1)线程的切换时间。(2)高优先级线程的抢先时间。(3)信号量响应时间。(4)线程转异常以及异常规复时间。
2、测试要领
测试中,启动的线程开始无条件轮回运行。以对指标(1)的测试为例,轮回中只举办运行次数累加和线程切换的操纵,无其他附加操纵,直至给出竣事事件,终止线程并给出线程的运行次数和时间。测试的计较功效都是在忽略线程自己的开销的环境下得出的,这里线程自身所耗费的时间通过测试较量占总耗费的时间的比例长短常小的,对计较功效没有太大的影响。别的若在线程中插手对线程自己开销的统计,将会引入其他的操纵,同样会有必然的时间开销,仍然会有误差存在。测试中对每一个测试项目皆举办五次反复测试,对得出的五个值取平均。
3、测试流程
这里的测试流程以对指标(1)的测试为例以流程图的形式加以说明,后头三项的测试与此相似。
4、测试步调
4.1 线程切换时间测试的根基步调
(1)建设两个沟通优先级的线程1和2。
(2)运行线程1获得线程1的当前运行次数后,当即切换到线程2。
(3)运行线程2获得线程2的当前运行次数后,当即切换到线程1。
(4)反复第2步和第3步,直到给出竣事事件。
(5)获得2至4步所耗费的全部时间和两线程别离的运行次数。
(6)计较线程间的切换时间。
这里设所耗费的时间为emplasedtime,别离运行的次数为runcount1和runcount2,则切换时间为emplasedtime/ (runcount1+runcount2-1)。以下几项与此雷同。
图1 线程切换时间测试流程
#p#副标题#e#
4.2 高优先级线程抢先时间测试的根基步调
(1)建设两个差异优先级的线程,假定线程1的优先级高于线程2。
(2)获得线程1的当前运行次数后,线程1将优先级降到低于线程2,线程1被线程2抢先。
(3)获得线程2的当前运行次数后,线程2将优先级降到低于线程1,线程2被线程1抢先。
(4)反复第2步和第3步,直到给出竣事事件。
(5)获得2至4步所耗费的全部时间和两线程别离运行的次数。
(6)计较高优先级线程抢先时间。
4.3 信号量响应时间测试的根基步调
(1)建设信号量1和信号量2。
(2)建有沟通优先级的线程1和2,并别离请求得到信号量1和信号量2。
(3)释放一个信号量1。
(4)线程1得到信号量1,获得当前运行次数后,当即释放信号量2。
(5)线程2得到信号量2,获得当前运行次数后,当即释放信号量1。
(6)反复第4和第5步,直到给出竣事事件。
(7)获得4至6步所耗费的全部时间和两线程别离运行的次数。
(8)计较线程对信号量的响应时间。
4.4 转异常以及从异常规复时间的测试步调
(1)建设运行一个线程。
(2)在线程中给出一个异常。
(3)异常处理惩罚中得出当前异常次数。
(4)反复第2和第3步,直到给出竣事事件。
(5)获得2至4步所耗费的全部时间和异常发生的总次数。
(6)计较转异常以及从异常规复的时间。
5、测试功效
表1 线程特别开销测试比拟
测试项目 | 线程切
换时间 |
高优先
级抢占 时间 |
信号量
响应时间 |
转异常以
及从异常 规复时间 |
未利用Intel C++编译器(us) |
1.12 |
2.27 |
2.38 |
14.59 |
利用Intel C++
编译器 (us) |
1.09 |
2.26 |
2.37 |
9.21 |
6、测试结论
#p#分页标题#e#
从以上四项的测试功效可以看出,除了转异常以及从异常规复在利用了Intel C++编译器后,执行效率有了较大提高(约能提高1/3)外,其他几项在利用编译器前后险些没有什么变革。从这里可以看出利用Intel C++编译器编译的代码对处理惩罚异常时的处理惩罚器能有优化结果,执行效率能有较大的提高;对付线程间的响应和切换却险些达不到优化的结果。
数学函数运算测试
前面提到的诸多应用规模,大量的数学运算是必须的。很多措施的主体就是大量的数学运算,运算速度对措施的执行速度也就会有抉择性的影响。若能提高数学运算的速度,相应的措施的执行效率就将会获得提高。
1、测试项目
测试项目包罗常用的三角函数运算和一些开方、次方、求模、对数等通例运算。究竟大量的巨大的运算也是由以上运算组合的。
2、测试要领
这里对每一项的测试都利用沟通的测试要领,即让每种运算都运行牢靠的大量次数(这里回收百万次),获得运行前后的时间值,求出二者之间的差值,等于运行牢靠次数的时间。再对同一种运算利用Intel C++编译器举办编译前后的运行时间值举办较量即可。测试中举办运算的函数参数皆为双精度型,对付同一种运算在利用Intel C++编译器前后皆利用沟通的参数,制止因带入参数的差异而影响比拟判定。测试中对每一个测试项目皆举办十次反复测试,对得出的十个值取平均。
3、测试功效
表2 百万次运算时间比拟
测试项目 | sin | cos | tan | sqrt | pow | fmod | Log10 |
未回收Intel C++编译器 (s) | 0.171 | 0.139 | 0.228 | 0.046 | 0.373 | 0.262 | 0.120 |
回收Intel C++编译器 (s) | 0.054 | 0.097 | 0.081 | 0.031 | 0.104 | 0.049 | 0.062 |
4、测试结论
#p#分页标题#e#
从以上对各项数学函数运算所耗时间的测试中可以看出,Intel C++编译器对数学函数运算的优化结果是较量明明的。针对差异的运算,优化结果也不尽沟通。对付同种运算在利用Intel C++编译器前后最差的也能将时间缩短至约本来的2/3,最好的能到达约本来的1/5。由此可以看出,若将其用于涉及有较大运算量的措施中,必将较大地提高措施的处理惩罚速度,较好的满意我们在应用中对措施速度的要求。
总结
从以上各项指标的比拟测试中,可以得出在淘汰线程间的转换开销方面Intel C++编译器并不能发挥什么浸染,对付线程自己转异常以及从异常规复方面却能有较大的提高。思量到异常和间断处理惩罚机制的相似性,我们也可揣度出其对间断处理惩罚效率的提高也应该是有较大浸染的。在数学函数运算方面,它能发挥出较大的浸染,能较明明地提高数学函数运算的效率。因此我们认为经Intel C++编译器编译过的数学函数运算的代码能更为高效的执行,这对包括较大都学运算的应用措施来讲,Intel C++编译器的利用将会对措施执行速度的提高提供辅佐,从而满意相关应用规模对处理惩罚速度的要求。