不要发了,我知道怎么回事了
怎么没有办法删除自己法的文章呢?
我觉得应该可以的
摘要:我一直以为VC6的执行效率很不错,无论如何这也是微软的产品,在Windows平台下,他的效率应该不会差到哪里去,你是不适也是这么认为的?我还一直以为在VC6下面,通过初始化列表会有一定的性能提高,理论上如此,实际上呢?
源于《Efficient C++》上面的一个例子,当时,他给出了下面的这个例子程序(稍加改动):
#include <iostream>
#include <ctime>
#include <string>
using namespace std;
class Timer
{
public:
Timer():start(clock()) { }
~Timer() { cout<<clock()-start<<"ms"<<endl; }
private:
clock_t start;
};
class Person
{
public:
Person(const char* s,const char* se) { name=s; sex=se; }
private:
string name,sex;
};
int main()
{
Timer* p=new Timer;
for(int i=0; i<1000000; ++i)
Person p("hustli","boy");
delete p;
return 0;
}
我们称这个版本为版本1,按照我们的常识,在Person构造函数中,没有使用初始化列表,那么,在构造Person对象的时候会2次初始化name和sex,效率自然会下降,而且应该下降很多!所以我们构造了版本2:
Person(const char* s, const char* se):name(s), sex(se) {}
首先,我们拿版本1在VC6,win2000下测试十次,取平均值,结果如下:13949.0ms
然后,我们用版本2在VC6,win2000下测试十次,取平均值,结果如下:14174.3ms
这个结果,让我郁闷了半天,想不明白,实在是想不明白,怎么会用了初始化列表,效率反而低了?我想可能和string类的实现有关,所以我把这两个版本在dev-C++4.9.5.0下进行了同样的测试,结果如下:
版本1:3186.5ms
版本2:3102.4ms
初看到这个结果,下了我一跳:怎么比VC6速度快了这么多?!
结论:可能Dev-C++更符合我们的预期结果:初始化列表可以提高效率。string的默认构造函数消耗很小。
疑惑:为什么VC6的结果会如此反常?为什么VC6的效率会如此低?期待高手的解答。
附:打开最优化就正常了,版本1:2156ms 版本2: 2119ms