代码优化试验——短循环优化(下)
测试程序2
#include <iostream.h>
#include <Timer.h>
void sum4()
{
int j = 0;
for (unsigned i = 1; i < 630001;)
{
j += i++;
j += i++;
j += i++;
j += i++;
}
}
void sum5()
{
int j = 0;
for (unsigned i = 1; i < 630001;)
{
j += i++;
j += i++;
j += i++;
j += i++;
j += i++;
}
}
int main()
{
int i, j; Timer timer;
timer.Start();
for (i = 0; i < 5; i++) sum4();
cout << "sum4 : " << timer.GetTime() << endl;
timer.Start();
sum4();sum4();sum4();sum4();sum4();
cout << "sum4E : " << timer.GetTime() << endl;
timer.Start();
for (i = 0; i < 5; i++) sum5();
cout << "sum5 : " << timer.GetTime() << endl;
timer.Start();
sum5();sum5();sum5();sum5();sum5();
cout << "sum5E : " << timer.GetTime() << endl;
timer.Start();
for (i = 0; i < 100; i++) sum4();
cout << "sum4H : " << timer.GetTime() << endl;
timer.Start();
for (i = 0; i < 100; i++) sum5();
cout << "sum5H : " << timer.GetTime() << endl;
timer.Start();
for (i = 0; i < 1000; i++)
for (j = 0; j < 5; j++) sum4();
cout << "sum4T : " << timer.GetTime() << endl;
timer.Start();
for (i = 0; i < 1000; i++)
{sum4();sum4();sum4();sum4();sum4();}
cout << "sum4TE: " << timer.GetTime() << endl;
for (i = 0; i < 1000; i++)
for (j = 0; j < 5; j++) sum5();
cout << "sum5T : " << timer.GetTime() << endl;
timer.Start();
for (i = 0; i < 1000; i++)
{sum5();sum5();sum5();sum5();sum5();}
cout << "sum5TE: " << timer.GetTime() << endl;
return 0;
}
测试结果2
|
Sum4 |
Sum4E |
Sum5 |
Sum5E |
Sum4H |
Sum5H |
Sum4T |
Sum4TE |
Sum5T |
Sum5TE |
|
VC6 Release,生成文件大小57,344B,以下时间单位ms | |||||||||
|
8.781 |
8.45918 |
7.54705 |
7.54677 |
174.909 |
152.656 |
8672.62 |
8794.3 |
16433.9 |
7633.09 |
|
BCC32,生成文件大小140,800B,以下时间单位ms | |||||||||
|
8.5874 |
8.91789 |
8.61534 |
7.64287 |
169.769 |
180.58 |
8548.64 |
8758.32 |
17586.1 |
7835.57 |
这个表是个大致趋势,更多的数据我就不列了。这个结果颇出乎我的预料,变化很不规律,我得出以下结论,还望大家商榷:
1. 如果是单层循环,短循环不需要展开,性能提升不明显。对于BCC32,更不需要展开,由于编译器的优化,展开后还不如原来的。但是对于原来就很高效的,BCC32展开还是能带来提升的。
2. 对于不能展开的单层短循环,VC6和循环体内的函数性能一致,BCC32由于有优化,结果出现了倒退。
3. 对于多层循环的内循环短循环,如果原来函数的性能不是很好,展开的效果并不明显,这里是出现了倒退。最奇怪的是原来性能最好的sum5,在不展开的情况下居然性能那么差,展开后竟又是性能最好的了,提高了一倍多,真是怪事。
综上,对于原来性能好的函数,短循环展开能提升性能;如果你对自己的代码没信心,就不要展开了,有时会适得其反。
- · 最简单的屏幕拷贝程序(象素拷贝)
- · vc入门宝典(十)
- · Win32学习笔记 第六章 程序6-3 Typer 说明
- · 自动建库的安装程序制作方法
- · “瑜珈山夜话” ----内存分配(二)
- · 让Windows 2000/XP中的任意窗口透明起来
- · 不比不知道,一比吓一跳!
- · “瑜珈山夜话” ----内存分配(三)
- · WTL体系结构(3)
- · 控制台程序的事件處理
- · 深入DCOM之DCOM的发展史
- · Windows程序效率
- · C++入门解惑(2)——初探指针(上)
- · 读好文章,快速理解COM组件知识,10分钟深刻阅读,获得超过2000元的培训
- · WTL的消息机制
- · DirectShow应用——支持DVD播放
- · 浏览器集成教学 自定义浏览器
- · 计算机科学与技术学生学习基础材料参考
- · 关于std::list的sort函数在VC6下的修正
- · 数据结构学习(C++)——线性链式结构总结(代后记)【2】
- · 深入DCOM之STA
- · 在COM中使用数组参数-数组指针
- · 在COM中使用数组参数-SafeArray
- · 在COM中使用数组参数-ICollection
- · win2000下“打开”对话框实现2000的风格综述
- · WTL体系结构(4)
- · 深入DCOM之MTA
- · 调试Release版本应用程序
- · 简化异常安全代码
- · Nt/2000/xp平台下的存储控制模型(Access Control Model)
- · Direct3D9初级教程
- · What are you, Anyway
- · 泛型编程:再现Min和Max
- · 在IE工具栏上简单定制按钮
- · Nt/2000/xp平台下的存储控制模型(Access Control Model) (二)
- · Multithreading in .NET Applications
- · SNMP用VC++6.0实现的方法
- · 数据结构学习(c++)——二叉树
