intrusive_ptr, тесты производительности shared_ptr

class X {
    public:
std::string name;
int age;

long references;
X(string n, int a) : references(0), name(n), age(a) {}
};

inline void intrusive_ptr_add_ref(X* x){
++x->references;
}

inline void intrusive_ptr_release(X* x){
if(--x->references == 0) 
    delete x;
}

int _tmain(int argc, _TCHAR* argv[])
{
time_t t=clock();
size_t rounds=1000000;

for(size_t i=0; i<rounds; i++)
{
    intrusive_ptr<X> myX(new X("Michael",40));
    myX->age++;
}
cout << "Time taken to generate " << rounds << " of intrusive_ptr is " 
    << clock()-t << endl;

t=clock();
for(size_t i=0; i<rounds; i++)
{
    boost::shared_ptr<X> myX(new X("Michael",40));
    myX->age++;
}
cout << "Time taken to generate " << rounds << " of shared_ptr is " 
    << clock()-t << endl;

t=clock();
for(size_t i=0; i<rounds; i++)
{
    std::shared_ptr<X> myX(new X("Michael",40));
    myX->age++;
}
cout << "Time taken to generate " << rounds << " of Microsoft shared_ptr is " 
    << clock()-t << endl;

t=clock();
for(size_t i=0; i<rounds; i++)
{
    boost::shared_ptr<X> myX=boost::make_shared<X>("Michael",40);
    myX->age++;
}
cout << "Time taken to generate " << rounds << " of shared_ptr using make_shared is " 
    << clock()-t << endl;

t=clock();
for(size_t i=0; i<rounds; i++)
{
    std::shared_ptr<X> myX=std::make_shared<X>("Michael",40);
    myX->age++;
}
cout << "Time taken to generate " << rounds << " of Microsoft shared_ptr using make_shared   is " 
    << clock()-t << endl;

_getche();
return 0;
}

Я получил результаты ниже, используя vs2010 для режима выпуска.

Время, необходимое для генерации 1000000 intrusive_ptr, равно 116 Время, необходимое для генерации 1000000 shared_ptr, равно 175 Время, необходимое для генерации 1000000 из Microsoft shared_ptr, равно 182 Время, необходимое для генерации 1000000 из shared_ptr с использованием make_shared: 176 Время, необходимое для генерации 1000000 из Microsoft shared_ptr с использованием make_shared is 120

Кажется, intrusive_ptr - самый быстрый, но, похоже, MS также хорошо справляется с shared_ptr с помощью функции make_shared. Но почему boost make_shared работает не так хорошо, как версия MS? Кто-нибудь делал похожий тест? Что-то не так с моим тестом или что-то, что я не учел?

0 ответов

Другие вопросы по тегам