Почему похоже, что конструкции boost :: shared_ptr становятся медленнее? - PullRequest
0 голосов
/ 19 апреля 2011

У меня проблема с 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 голосов
/ 06 декабря 2013

clock() ужасный счетчик времени. Вы можете едва посчитать миллисекунды с этим. используйте monotic_clock или get_time_of_day. Или QueryPerformanceCounter, если вы работаете в Windows.

Далее, этот тест не тестирует время построения shared_ptr, он измеряет в основном время выделения объекта A. В самом shared_ptr также есть выделение для хранения счетчика ссылок.

используйте функцию make_shared (вместо shared_ptr(new A)) для ускорения всего этого примерно в 2 раза.

...