龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

编译器对标准库优化小测试

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
《C++沉思录》上面有一句话说,尽量使用标准库(其实是指STL),因为编译器可以对标准库的代码进行优化。我们可以做个测试来证实这句话,如下的代码: #include #include #include #incl

  《C++沉思录》上面有一句话说,尽量使用标准库(其实是指STL),因为编译器可以对标准库的代码进行优化。我们可以做个测试来证实这句话,如下的代码:

  

  #include

  

  #include

  

  #include

  

  #include

  

  using namespace std;

  

  #define TESTNUM 1000000

  

  #define STRINGLENGTH 1000

  

  string CreateString()

  

  {

  

   string s;

  

   for (int i = 0; i < STRINGLENGTH; ++i)

  

   {

  

   s += char(rand()%255+1);

  

   }

  

   return s;

  

  }

  

  template inline

  

  void MySwap(_Ty& _Left, _Ty& _Right)

  

  { // exchange values stored at _Left and _Right

  

   _Ty _Tmp = _Left;

  

   _Left = _Right, _Right = _Tmp;

  

  }

  

  int main()

  

  {

  

   vector box;

  

   vector box2;

  

   for (int i = 0; i < 100; ++i)

  

   {

  

   box.push_back(CreateString());

  

   box2.push_back(NULL);

  

   }

  

   {

  

   clock_t t1 = clock();

  

   for (int i = 0; i < TESTNUM; ++i)

  

   {

  

   MySwap(box[rand()%100], box[rand()%100]);

  

   }

  

   cout << clock() - t1 << endl;

  

   }

  

   {

  

   clock_t t1 = clock();

  

   for (int i = 0; i < TESTNUM; ++i)

  

   {

  

   MySwap(box2[rand()%100], box2[rand()%100]);

  

   }

  

   cout << clock() - t1 << endl;

  

   }

  

   {

  

   clock_t t1 = clock();

  

   for (int i = 0; i < TESTNUM; ++i)

  

   {

  

   swap(box[rand()%100], box[rand()%100]);

  

   }

  

   cout << clock() - t1 << endl;

  

   }

  

   return 0;

  

  }

  

  MySwap实际上就是从STL里面原样拷贝出来的,但是我们可以看到这和STL的Swap效率有天壤之别。因为string实际上一些必要的信息加上字符串缓存构成的,对于STL的Swap,编译器知道只需要交换那些必要信息就可以了,而不需要进行深拷贝;但是对于我们写的MySwap,编译器不知道,所以进行了深拷贝。Swap比交换指针慢一点是因为string的必要信息比一个指针多一些。假如增加测试字符串的长度,会发现Swap的耗时是不变的,而MySwap的耗时会线形增加。

  

  所以我们大可不必因为恐慌string的深拷贝,而在vector里面使用string的指针。

  

精彩图集

赞助商链接