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
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>&
yerineconst T&
kullanın. const shared_ptr<T const>&
kullanarak performans sorunu olduğundaconst T*
daha güvenli.
C - başvurular için geçen std::shared_...
değeri tarafından başvuru veya shared_...
C başvuruyla üzerinden geçen gösterici...
Docker kabı çalışma zamanı performans ...
Dosya kullandıktan sonra başka bir işl...