不比不知道,一比吓一跳!

类别:VC语言 点击:0 评论:0 推荐:

不要发了,我知道怎么回事了   

怎么没有办法删除自己法的文章呢?

我觉得应该可以的

  

 

  摘要:我一直以为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

本文地址:http://com.8s8s.com/it/it1643.htm