【问题标题】:Why does it look like boost::shared_ptr constructions are getting slower?为什么 boost::shared_ptr 结构看起来越来越慢?
【发布时间】:2011-04-19 08:01:58
【问题描述】:

我对 boost shared_ptr 有疑问。第一次迭代后,循环中智能指针的初始化时间增加。 第一次迭代需要 40 毫秒。每隔一次迭代大约需要 400 毫秒。 我不知道为什么会这样。我检查并没有内存泄漏,并且调用了所有析构函数。有没有人有这个案例的解决方案?

PS。但是,当我使用 boost::ptr_vector 时,时间并没有增加(但仅在调试版本中:))。

查看示例:

class A;
typedef boost::shared_ptr<A> A_ptr;
class A
{
public:
  A(){}
  A_ptr add(A* new_A)
  {
    A_ptr new_A_ptr( new_A );
    children.push_back(new_A_ptr);
    return new_A_ptr;
  }
  ~A(){}
  vector<A_ptr> children;
};

void test()
{
   A_ptr root_ptr( new A() );
   for (int k=0; k<200; k++)
   {
        A_ptr sub_ptr = root_ptr->add( new A() );
        for (int l=0; l<100; l++) sub_ptr->add( new A() );
   }
};

int main()
{
  for(int i=0; i<10; i++)
  {
    unsigned t = clock();    
    test();
    std::cout<<"elapsed: "<<clock()-t<<std::endl;
  }

  return 0;
}

【问题讨论】:

  • 您能否澄清一下:“循环中智能指针的初始化在第一次迭代后增加。” ??什么初始化?裁判数?什么?
  • 循环中的第一次迭代时间约为 40 毫秒,第二次和其他时间约为 400 毫秒
  • 我刚做了测试,我不明白为什么时间会增加。

标签: boost shared-ptr smart-pointers


【解决方案1】:

clock() 是一个糟糕的计时器。你几乎无法计算毫秒。使用 monotic_clock 或 get_time_of_day。或者 QueryPerformanceCounter 如果您在 Windows 上。

接下来,这个测试不是测试 shared_ptr 的构建时间,它主要是测量对象A 的分配时间。 shared_ptr 本身也有一个分配来存储引用计数。

使用 make_shared 函数(而不是 shared_ptr(new A))将这一切加速大约 2 倍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 2018-04-21
    • 2021-08-28
    • 1970-01-01
    • 2015-12-20
    相关资源
    最近更新 更多