SORU
23 Mart 2010, Salı


Geçen maliyeti shared_ptr tarafından

Ben std::tr1::shared_ptr benim uygulama genelinde yaygın. Bu işlev bağımsız değişkenleri içinde geçen nesneleri içerir. Aşağıdakileri göz önünde bulundurun:

class Dataset {...}

void f( shared_ptr< Dataset const > pds ) {...}
void g( shared_ptr< Dataset const > pds ) {...}
...

Veri kümesi nesnesi shared_ptr ile paylaşmalarını f ve g içinde varlığını garanti ederken, işlevleri shared_ptr nesneleri oluşturulan ve özelleştirmeler bir sürü neden kez, milyonlarca denebilir. İşte yeni bir çalışma düz gprof profilinin parçacığı:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total
 time   seconds   seconds    calls   s/call   s/call  name
  9.74    295.39    35.12 2451177304     0.00     0.00  std::tr1::__shared_count::__shared_count(std::tr1::__shared_count const&)
  8.03    324.34    28.95 2451252116     0.00     0.00  std::tr1::__shared_count::~__shared_count()

Yani, 17% ~çalışma shared_ptr nesnelerle başvuru sayma harcandı. Bu normal mi?

Başvurum büyük bir bölümünü tek iş parçacıklı ve yeniden yazma gibi işlevleri hakkında düşünüyordum

void f( const Dataset& ds ) {...}

ve aramaları yerine

shared_ptr< Dataset > pds( new Dataset(...) );
f( pds );

ile

f( *pds );

emin olduğum yerlerde nesnesi programın akışı f içindeyken zarar görecektir. Ama işlev imzaları bir sürü değiştirmek için çalıştırmadan önce / aramalar, shared_ptr geçen tipik bir performans isabet ne olduğunu bilmek istedim. Shared_ptr gibi çok sık çağırılır işlevleri için kullanılmamalıdır.

Herhangi bir giriş duyacağız. Okuduğunuz için teşekkür ederim.

-Artem

Güncelleme:Fonksiyonları bir avuç const Dataset&, kabul değiştirdikten sonra yeni profil bu gibi görünüyor:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total
 time   seconds   seconds    calls   s/call   s/call  name
  0.15    241.62     0.37 24981902     0.00     0.00  std::tr1::__shared_count::~__shared_count()
  0.12    241.91     0.30 28342376     0.00     0.00  std::tr1::__shared_count::__shared_count(std::tr1::__shared_count const&)

Yıkıcı çağrıları kopya kurucu aramalar sayısından küçük olmak sayısına göre biraz kafam karıştı, ama genel olarak ilişkili çalıştırma azalması ile çok memnunum. Tavsiyeleri için herkese teşekkürler.

CEVAP
23 Mart 2010, Salı


Her zaman pas ** 12inşreferans:

void f(const shared_ptr<Dataset const>& pds) {...} 
void g(const shared_ptr<Dataset const>& pds) {...} 

Düzenleme:Güvenlik sorunları, başkaları tarafından belirtilen ilgili:

  • Ağır shared_ptr uygulama boyunca kullanırken, değer geçen zaman (P gördüm) muazzam miktarda alacak.
  • Bu bağımsız değişkeni boş olamaz const shared_ptr<T const>& yerine const T& kullanın.
  • const shared_ptr<T const>& kullanarak performans sorunu olduğunda const T* daha güvenli.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jonathan Morrison

    Jonathan Mor

    24 Mart 2010
  • Richard Laxa

    Richard Laxa

    30 AĞUSTOS 2012
  • tychoadragmire

    tychoadragmi

    20 Mart 2006