为什么看起来像boost :: shared_ptr结构变得越来越慢?

时间:2011-04-19 08:01:58

标签: boost shared-ptr smart-pointers

我遇到了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;
}

1 个答案:

答案 0 :(得分:0)

clock()是一个可怕的时间计数器。你几乎算不上几毫秒。使用monotic_clock或get_time_of_day。或者如果您在Windows上,则使用QueryPerformanceCounter。

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

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