灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2328回复:0

[C++技术]C++基础知识:编译器对标准库优化小测试

楼主#
更多 发布于:2012-09-06 11:35


  《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的耗时会线形增加。


喜欢0 评分0
游客

返回顶部