#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;
}
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,在不展开的情况下居然性能那么差,展开后竟又是性能最好的了,提高了一倍多,真是怪事。
综上,对于原来性能好的函数,短循环展开能提升性能;如果你对自己的代码没信心,就不要展开了,有时会适得其反。