2010-01-18 34 views
16

C++ programımın gprof kullanarak zamanını harcadığı zamanı bulmaya çalışıyorum. Benim ikilemim: Eğer sürüm oluşturma için kullandığım aynı eniyileme ayarları ile derlerseniz, hemen hemen her şey sıralanır ve gprof bana, zamanımın% 90'ının, her şeyin dizildiği bir çekirdek rutinde geçirildiğini söyler. Diğer yandan, satır içi devre dışı bırakılmışsa, program büyüklük derecesini daha yavaş çalıştırır.Agresif satır içi varlığında C++ profili?

programımın etkin inlining derlendi benim göbek rutinden denen zaman prosedürleri, alarak ne kadar öğrenmek istiyorum.

Ben dört çekirdekli Intel makinede 64 bit Ubuntu 9.04 çalıştırıyorum. Google-perftools'a baktım, ancak x86_64 üzerinde iyi çalışmıyor gibi görünüyor. Bir 32-bit makinede çalışan bir seçenek değildir.

Herkes ben daha etkili benim uygulama profil nasıl olarak öneriniz var mı, inlining etkinken?

Düzenleme

: İşte benim sorunum bazı açıklama olduğunu. Başlangıçta açık değilse özür dilerim.

Uygulamamda zamanın harcanan zamanını bulmak istiyorum. Optimize edilmiş yapmamın profillenmesi, gprof'un zamanın% 90'ının her şeyin ana hatlarıyla belirtildiği ana hatta harcanacağını söyleyerek sonuçlandı. Profillemeden önce bunu zaten biliyordum!

Ne öğrenmek istiyorum satır içine fonksiyonlar benim yapı seçeneklerinde optimizasyonu veya satır içi uygulaması devre dışı bırakmadan, tercihen alarak ne kadar zamandır. Uygulama, inlining devre dışıyken profil oluştururken, daha yavaş bir büyüklük sırası gibi bir şeydir. Yürütme süresindeki bu fark bir kolaylık sorunu olmakla birlikte, inlining devre dışıyken oluşturulan programın performans profilinin, satır içi etkinleştirilmiş yerleşik programın performans profiline büyük ölçüde karşılık geleceğinden emin değilim.

Kısacası

: optimizasyonu veya satır içi uygulaması devre dışı olmadan C++ programı üzerinde yararlı profilleme bilgi almak için bir yol var?

+1

http://stackoverflow.com/questions/375913/what-can-i-use-to-profile-c-code-in-linux. Bu iş parçacığı bir sürü bilgi var –

cevap

0

kodu (tabii ki, kenara kolaylık) yavaş çalıştığını fark etmez - Profilci hala size her işlevinde harcanan zamanın doğru oranda söyleyecektir.

+0

başka bir 10 oy-off açık ve hiçbir değer eklemek için oy - whee: P –

+3

Belki - ama yine de, bu durum böyle değil tamamen mümkündür. Fonksiyon çağrılarını bir ağaç olarak görüyorsanız, tüm alt alanların eşit olarak satır içi kullanımdan yararlanması gerekir. Gerçekte, bu neredeyse her zaman yanlış olacaktır. Fark bazı durumlarda önemsiz, ancak diğerlerinde oldukça anlamlı olacaktır. –

+0

ve çoğu profilleyicinin donanım kesintileri tarafından çalıştırıldığı - ve diğer gürültüyü de içerir. inlining (çok mümkündür) temel işlevi daha iyi duruma getirme sağlar –

2

CPU yüksek performanslı zamanlama mekanizmasını kullanarak birkaç makro geliştirin (örneğin x86) - Sistem çağrıları itimat ve belirli CPU için temel döngü çalışan tek bir iş parçacığı bağlanmayan rutinleri (set the affinity). Aşağıdaki makroları uygulamanız gerekir. Bu muhtemelen profile en doğru yoldur -

PROF_INIT //allocate any variables -- probably a const char 
PROF_START("name") // start a timer 
PROF_STOP() // end a timer and calculate the difference -- 
      // which you write out using a async fd 

Ben zamanlaması çağrı ağacının bağlamında içine çağırır yerleştirilen makro emin oldum ben ilgi her işlevde yerleştirilen böyle bir şey vardı .

Not:

Bu yöntem koduna göre tahrik - ve snoop herhangi bir şekilde kod harici bir araç dayanmaz. Küçük kod bölümleri söz konusu olduğunda, Snooping, Sampling ve interrupt tahrikli profilleme yanlıştır. Ayrıca, zamanlama verilerinin nerede ve ne zaman toplandığını kontrol etmek istersiniz - kodunuzdaki belirli yapılarda olduğu gibi, döngüler, özyinelemeli bir çağrı zincirinin başlangıcı veya toplu bellek ayırma işlemleri gibi.

- düzenle -

Sen link from this answer to one of my questions ilginizi çekebilir.

+0

+1. En azından denemeye değer olmalı. – Macke

9

kodunun en iyi duruma getirme değerine sahip olduğunu tahmin etmek için ne yapmak istediğinizi öğrenmek isterim. Bu zamanlama fonksiyonlarından çok farklı. You can do better than gprof.

Here's a fairly complete explanation of how to do it.

Sen bunu elle yapmak veya bu tür oprofile ve RotateRight/Zoom aynı bilgi verebilir profilleyicilerini, birini kullanabilirsiniz.

BTW, satır içi, yalnızca satır içi rutinler küçükse ve işlevleri çağırmıyorsa ve çağrıldıkları satırlar etkin olmak için yeterli zaman etkinse, önemli bir değere sahiptir. hata ayıklama ve sürüm oluşturma arasındaki büyüklük performans oranı sırasına gelince

, belki ya da belki değil inlining nedeniyle birçok etkeni olabilir. Her iki durumda da neler olduğunu öğrenmek için yukarıda bahsedilen stackshot yöntemini kullanabilirsiniz. Hata ayıklama yapılarının, örneğin, yinelemeli veri yapısı doğrulaması gibi başka nedenlerle yavaş olabileceğini buldum.

+0

(+1) güzel bilgi, özellikle de (yani anahtarın yakalama olduğunu ve örneklemenin olmadığını söyleyen) yığınsal bağlantı, tüm araçlar yakalamadan ziyade ölçüm gibi görünüyor - istif de. –

+0

@Hassan: Evet. Bunu, ölçüm kesinliğinden ziyade, konumun doğruluğu üzerinde bir vurgu meselesi olarak düşünüyorum. Oprofile ve Zoom, yığın örneklerini duvar saati zamanında alır ve size, bu ifadeyi içeren örneklerin% 'sini ifade edebilir. Çok sayıda örnek verdiyse, bu tamam ama gerçekten gerekli değil. Şahsen ben el ile yapıyorum, çünkü daha sonra üzerinde çalışılan veriler gibi daha fazla durum bilgisi görebiliyorum. Çoğu zaman bu önemli bir bilgidir. –

+0

Evet, anlaşma yapıyorum, bu işi el ile de yapıyorum - ve oyun motorları/gömülü çalışma/işletim sistemi rutinleri ve RTOS işlerinde profil oluşturma konusunda fikir birliği bu yaklaşımı da kullanmaktadır. –

2

Sen montaj performans ayrıntı hat seviyesini verebilirim böyle Intel'in VTune olarak daha güçlü profiler, kullanabilirsiniz.

http://software.intel.com/en-us/intel-vtune/

Windows ve Linux için, ama ücretli mi ...

+0

yeh, bu hile yapar - teoride öyle. Bu araçlar, Windows'ta korkunç bir şekilde güvenilmezdi - bana BS200'ü birçok makinede win2003 ve xp'de verdiler ve genellikle diğer sıkıntılara da neden oldular. –

0

Satır içi yürütme sayımları vermek için gcov'u kullanabilirsiniz. Bu, en azından hangi satır içi fonksiyonların darboğaz olduğunu söylemelidir.

+0

Önerinizde gcov ile biraz oynamıştım. Bana çok zaman harcadığını söylemek için yeterli olmayan çağrı sayımı verir. –