Yığın Örneklemenin Ötesinde: C ++ Profilleyicileri


146

Bir Hacker's Tale

Tarih 12/02/10. Noel'den önceki günler akıp gidiyor ve bir pencere programcısı olarak büyük bir yol tıkanıklığına uğradım. AQTime kullanıyorum, uykulu, parlak ve çok uykulu denedim ve biz konuşurken VTune yükleniyor. VS2008 profil oluşturucusunu kullanmaya çalıştım ve hem olumlu bir şekilde cezalandırıyor hem de çoğu zaman duyarsız. Rastgele duraklama tekniğini kullandım. Çağrı ağaçlarını inceledim. İşlev izlerini ateşledim. Ancak işin üzücü acı verici yanı, üzerinde çalıştığım uygulamanın bir milyon satırdan fazla kod içermesi ve muhtemelen başka bir milyon satır değerinde üçüncü taraf uygulamaları olması.

Daha iyi aletlere ihtiyacım var. Diğer konuları okudum. Her konuda listelenen her profili denedim. Bu önemsiz ve pahalı seçeneklerden daha iyi bir şey olmalı ya da neredeyse hiç kazanç sağlamayan gülünç miktarlarda iş. Sorunları daha da karmaşık hale getirmek için, kodumuz yoğun bir şekilde iş parçacıklıdır ve bazıları o kadar kırılgan olan bir dizi Qt Olay döngüsü çalıştırır ki, zamanlama gecikmeleri nedeniyle ağır enstrümantasyon altında çökerler. Neden birden çok olay döngüsü çalıştırdığımızı sorma. Kimse bana söyleyemez.

Windows ortamında Valgrind'in çizgileri boyunca daha fazla seçenek var mı?
Zaten denediğim uzun kırık takımlardan daha iyi bir şey var mı?
Qt ile entegre etmek için tasarlanmış bir şey var mı, belki de kuyruktaki olayların yararlı bir gösterimi var mı?

İtalik olarak gerçekten yararlı olanlarla denediğim araçların tam listesi:

  • AQTime: Oldukça iyi! Derin özyineleme ile ilgili bazı sorunlar yaşarsınız, ancak bu durumlarda çağrı grafiği doğrudur ve sahip olabileceğiniz herhangi bir karışıklığı gidermek için kullanılabilir. Mükemmel bir araç değil ama denemeye değer. İhtiyaçlarınıza uygun olabilir ve çoğu zaman benim için kesinlikle yeterince iyiydi.
  • Hata ayıklama modunda Rastgele Duraklatma saldırısı: Yeterli bilgi yeterli değil.
    İyi bir araç ama tam bir çözüm değil.
  • Parallel Studios: Nükleer seçenek. Rahatsız edici, tuhaf ve delice güçlü. Bence 30 günlük değerlendirmeyi yapıp uygun olup olmadığını anlamalısın. Bu da çok havalı.
  • AMD Codeanalyst: Harika, kullanımı kolay, çok açık ama bence bu bir çevre meselesi. Ücretsiz olduğu için denemenizi tavsiye ederim.
  • Luke Stackwalker: Küçük projelerde iyi çalışıyor, biraz da bizim projemizde çalıştırmaya çalışıyor. Yine de bazı iyi sonuçlar ve kişisel görevlerim için kesinlikle Sleepy'nin yerini alıyor.
  • PurifyPlus: Win-x64 ortamları için destek yok, özellikle Windows 7. Aksi takdirde mükemmel. Diğer bölümlerdeki bazı meslektaşlarım buna yemin ediyor.
  • VS2008 Profiler: Fonksiyon izleme modunda gerekli çözünürlükte 100 + gigs aralığında çıktı üretir. Artı tarafta, sağlam sonuçlar üretir.
  • GProf: GCC'nin orta derecede etkili olmasını gerektirir.
  • VTune: VTune'un W7'si suçlu sınırlarını destekliyor. Aksi takdirde mükemmel
  • PIN: Kendi aracımı hacklemem gerekiyor, bu yüzden bu son çare.
  • Uykulu \ Çok Uykulu: Küçük uygulamalar için kullanışlıdır, ancak burada başarısız oluyorum.
  • EasyProfiler: Nerede alet edileceğini belirtmek için biraz manuel olarak enjekte edilen kodun sakıncası yoksa fena değil.
  • Valgrind: * Yalnızca nix, ancak bu ortamdayken çok iyi.
  • OProfile: Yalnızca Linux.
  • Proffy: Vahşi atları vururlar.

Denemediğim önerilen araçlar:

  • XPerf:
  • Glowcode:
  • Devpartner:

Notlar: Şu anda Intel ortamı. VS2008, kitaplıkları artırın. Qt 4+. Ve hepsinin sefil uğultusu: trolltech aracılığıyla Qt / MFC entegrasyonu.


Şimdi: Neredeyse iki hafta sonra sorunum çözülmüş gibi görünüyor. Listedeki hemen hemen her şey ve birkaç kişisel numaram dahil olmak üzere çeşitli araçlar sayesinde, birincil darboğazları bulduk. Ancak, yeni profil oluşturucuların yanı sıra yeni teknolojiyi test etmeye, keşfetmeye ve denemeye devam edeceğim. Neden? Çünkü bunu size borçluyum, çünkü harikasınız. Zaman çizelgesini biraz yavaşlatıyor, ancak yeni araçları denemeye devam edeceğim için hala çok heyecanlıyım.

Özet
Diğer birçok sorunun yanı sıra, bir dizi bileşen yakın zamanda yanlış iş parçacığı modeline geçirilmiş ve altımızdaki kodun birdenbire artık çok iş parçacıklı olmaması nedeniyle ciddi takılmalara neden olmuştu. NDA'mı ihlal ettiği için daha fazlasını söyleyemem, ancak size bunun hiçbir zaman tesadüfi incelemeyle veya hatta normal kod incelemesiyle bulunamayacağını söyleyebilirim. Profil oluşturucular, çağrı grafikleri ve birlikte rastgele duraklamalar olmasaydı, gökyüzünün güzel mavi yayında hâlâ öfkemizi haykırıyor olurduk. Neyse ki, tanıdığım en iyi bilgisayar korsanlarından bazılarıyla çalışıyorum ve harika araçlar ve harika insanlarla dolu harika bir 'dizeye erişimim var.

Beyler, bunu çok takdir ediyorum ve sadece her birinizi bir ödülle ödüllendirecek kadar itibarım olmadığına üzülüyorum. Hâlâ bunun SO konusunda şimdiye kadar sahip olduğumuz sorulardan daha iyi bir yanıt almamız gereken önemli bir soru olduğunu düşünüyorum.

Sonuç olarak, önümüzdeki üç hafta boyunca her hafta, karşılayabileceğim en büyük ödülü koyacağım ve bunu, yaygın bir bilgi olmadığını düşündüğüm en güzel araçla yanıt olarak ödüllendireceğim. Üç hafta sonra, umarım profil oluşturucuların kesin bir profilini biriktirmiş olacağız, eğer punning'imi affederseniz.

Take-away
Profil oluşturucu kullanın. Ritchie, Kernighan, Bentley ve Knuth için yeterince iyidirler. Kim olduğunu düşündüğün umrumda değil. Profil oluşturucu kullanın. Sahip olduğunuz işe yaramazsa, başka bir tane bulun. Bulamazsan, kod bir. Birini kodlayamıyorsanız veya bu küçük bir kapatmadır ya da sadece takılıp kalıyorsanız, rastgele duraklatma kullanın. Her şey başarısız olursa, bir profilciyi vurmaları için bazı yüksek lisans öğrencileri işe alın.


Daha Uzun Bir Bakış
Bu yüzden, biraz geriye dönük bir yazı yazmanın güzel olacağını düşündüm. Kısmen, aslında PIN Aracının üzerine kurulu olduğu için, Parallel Studios ile kapsamlı bir şekilde çalışmayı seçtim. Dahil olan bazı araştırmacılarla akademik ilişkilerde bulunduktan sonra, bunun muhtemelen bir kalitenin işareti olduğunu hissettim. Neyse ki haklıydım. GUI biraz korkunç olsa da, IPS'yi inanılmaz derecede faydalı buldum, ancak herkes için rahat bir şekilde öneremiyorum. Kritik olarak, satır düzeyinde isabet sayılarını elde etmenin bariz bir yolu yok, AQT ve diğer bazı profil oluşturucuların sağladığı bir şey ve diğer şeylerin yanı sıra dal seçimi oranını incelemek için çok yararlı buldum. Net olarak, AQTime'ı kullanmaktan da keyif aldım ve desteğini gerçekten duyarlı buldum. Yine, tavsiyeme uygun olmalıyım: Birçok özelliği o kadar iyi çalışmıyor ve bazıları Win7x64'te tamamen çökmeye meyilli. XPerf de takdire şayan bir performans sergiledi, ancak belirli türden uygulamalarda iyi okumalar elde etmek için gereken örnekleme ayrıntısı için acı verici derecede yavaş.

Şu anda, bir W7x64 ortamında C ++ kodunun profilini çıkarmak için kesin bir seçenek olduğunu düşünmediğimi söylemeliyim, ancak kesinlikle herhangi bir yararlı hizmeti gerçekleştiremeyen seçenekler var.


18
Farklı bir iş bulmayı düşündün mü? :)
Nikolai Fetissov

10
Bu kadar zor bulmacaları çözmek için başka nerede bulabilirim? Sanırım kernel hacklemeye geri dönebilirim, ama bu da işe yaramıyor.
Jake Kurzer

3
@Kos, gprof'un herhangi bir işe yaraması için -pg ile derlenmiş gcc araç setini kullanmanız gerektiğini düşünüyorum, aksi takdirde gprof.out dosyasını oluşturmaz. OP'nin durumunda, gprof kullanımını engelleyen msvc kullanıyormuş gibi görünüyor. Listedeki diğerlerinin ihtiyaçlarını karşılamaması durumunda
gprof'un

2
@Marc Gravell Bu yeterince adil, sanırım .... En iyi korunan gönderilerin aniden topluluk alanına geçmesi, sorunuzu veya cevabınızı daha fazla güncellediğiniz ve sürdürdüğünüz bir durumu etkili bir şekilde üretmesi bana garip bir buluşsal yöntem gibi görünüyor. genel olarak toplumun gözünde bu bakımdan o kadar az kurtulursunuz. Bunu metaya götürmeli miyim?
Jake Kurzer

2
Profil oluşturucular hakkında şu anda bildiklerime göre, geriye dönük bir inceleme isteyen var mı?
Jake Kurzer

Yanıtlar:


65

İlk:

Zaman örnekleme profil oluşturucuları, CPU örnekleme profil oluşturucularından daha sağlamdır. Windows geliştirme araçlarına pek aşina değilim, bu yüzden hangilerinin hangileri olduğunu söyleyemiyorum. Profil oluşturucuların çoğu CPU örneklemesidir.

Bir CPU örnekleme profilcisi, her N talimatta bir yığın izini alır.
Bu teknik, kodunuzun CPU'ya bağlı kısımlarını ortaya çıkaracaktır. Uygulamanızdaki şişe boynu buysa, bu harika. Uygulama dizileriniz zamanlarının çoğunu bir muteks için savaşarak geçiriyorsa o kadar iyi değil.

Bir zaman örnekleme profilcisi, her N mikrosaniyede bir yığın izini yakalar.
Bu teknik "yavaş" kodu sıfırlayacaktır . Nedenin CPU'ya bağlı, IO'ya bağlı engelleme, mutex'e bağlı veya kodun önbelleğe atılan bölümleri olup olmadığı. Kısacası, uygulamanız yavaşlatan kod parçası öne çıkacaktır.

Bu nedenle, özellikle iş parçacıklı kodun profilini çıkarırken mümkünse bir zaman örnekleme profilleyici kullanın.

İkinci:

Örnekleme profil oluşturucuları veri yığınları oluşturur. Veriler son derece kullanışlıdır, ancak genellikle kolayca yararlı olacak çok fazla şey vardır. Bir profil veri görselleştiricisi burada çok yardımcı olur. Profil verilerini görselleştirmek için bulduğum en iyi araç gprof2dot'tur . Adın sizi yanıltmasına izin vermeyin, her türlü örnekleme profili çıktısını (AQtime, Sleepy, XPerf, vb.) Yönetir. Görselleştirme, sorun teşkil eden işlevleri gösterdiğinde, gerçek nedenin ne olduğuna dair daha iyi ipuçları almak için ham profil verilerine geri dönün.

Gprof2dot aracı , daha sonra bir graphviz aracına beslediğiniz bir nokta grafik açıklaması oluşturur . Çıktı, temelde uygulama üzerindeki etkilerine göre renk kodlu işlevlere sahip bir çağrı grafiğidir. alternatif metin

Gprof2dot'un güzel çıktılar oluşturması için birkaç ipucu.

  • --skewSıcak kod yollarını kolayca görebilmek için grafiklerimde 0,001 kullanıyorum . Aksi takdirde int main()grafiğe hakim olur.
  • C ++ şablonlarıyla çılgınca bir şey yapıyorsanız, muhtemelen eklemek isteyeceksiniz --strip. Bu özellikle Boost için geçerlidir.
  • Örnekleme verilerimi oluşturmak için OProfile kullanıyorum. İyi bir çıktı elde etmek için onu 3. taraf ve sistem kitaplıklarımdan hata ayıklama sembollerini yükleyecek şekilde yapılandırmam gerekiyor. Aynısını yaptığınızdan emin olun, aksi takdirde CRT'nin, gerçekte olan şey mallocyığını çöpe atmak ve% 15'i yemek olduğunda uygulamanızın zamanının% 20'sini aldığını göreceksiniz .

Sorunlarıma tam yanıtın bu olduğunu bilmesem de, gprof2dot geniş cephaneliğime girdi ve hızla favori bir noktayı üstleniyor. Bence bu bir lütala değer!
Jake Kurzer

2
Bu soruyu Linux zaman örneği tabanlı profil oluşturucuya sordum . OProfile'ın zamana dayalı örnekleme alması beklenir. Çok yüksek kalitede çıktı üretirler, bu yüzden bu özelliği eklediklerinde onları kullanacağım. Bunun dışında bir arkadaşım profil oluşturma için bir gdb + geri izleme çözümünü birlikte hack'ledi. Çok huysuz, ama darboğazı buldu.
deft_code

@deft_code: "Profil oluşturma için bir gdb + geri izleme çözümünü birlikte hackleyin . Çok hilekar ama darboğazı buldu." Sürekli konuşmamı onaylıyorsunuz :) Bazı insanlar profillemenin güzel olmasını istiyor, ancak sonuçlar ihtiyacınız olan şeyse, işe yarayanla gidin, güzel olanla değil .
Mike Dunlavey

Mike Dunlavey'e katılıyorum. XPerf / WPA gibi şeyler çok güzel ve güçlü görünüyor, ancak bu araçların nasıl kullanılacağını bulmak biraz zaman alıyor ve günün sonunda rastgele duraklatma çok kolay ve sorunu çözmek için daha iyi bilgiler sağlıyor. Daha otomatik çözümler, darboğazı çözmek için gereken kritik bilgileri filtrelemekten daha sık görünmektedir.
JDiMatteo

16

Rastgele duraklamayı denediğinizde ne oldu? Bir canavar uygulamasında her zaman kullanıyorum. Yeterli bilgi vermediğini söylediniz ve yüksek çözünürlüğe ihtiyacınız olduğunu söylediniz. Bazen insanlar onu nasıl kullanacaklarını anlamak için biraz yardıma ihtiyaç duyar.

VS altında yaptığım şey, yığın görüntüsünü bana işlev argümanlarını göstermeyecek şekilde yapılandırmak, çünkü bu, yığının IMO görüntüsünü tamamen okunamaz hale getiriyor.

Sonra beni beklettiği süre boyunca "duraklat" a basarak yaklaşık 10 örnek alıyorum . Referans olarak not defterine kopyalamak için ^ A, ^ C ve ^ V kullanıyorum. Sonra her birini inceliyorum, o sırada başarmaya çalışma sürecinde ne olduğunu anlamaya çalışıyorum.

2 veya daha fazla örnekte bir şeyler başarmaya çalışıyorduysa ve bu kesinlikle gerekli değilse, o zaman canlı bir sorun buldum ve kabaca düzeltmenin ne kadar tasarruf edeceğini biliyorum.

Kesin yüzdeler önemli değildir ve hakkında hiçbir şey yapamaz, çünkü içinde ne 3. taraf koduna gider önemli değildir gibi gerçekten, bilmek gerekmez şeyler var olanlar . Ne hakkında bir şeyler yapabiliriz kodda çağrı noktalarının zengin kümesidir olabilir her yığın numunesi üzerinde görüntülenen değiştirebilmektedirler. Bu senin mutlu avlanma yerin.

Bulduğum şey türlerine örnekler:

  • Başlangıç ​​sırasında, DLL kaynaklarından uluslararasılaştırılmış karakter dizelerini çıkarmaya çalışırken, yaklaşık 30 katman derinliğinde olabilir. Eğer gerçek dizeler incelendiğinde, kullanıcının gerçekte hiç görmediği dizeler gibi, dizelerin gerçekten uluslararasılaştırılmasına gerek olmadığı kolayca ortaya çıkabilir .

  • Normal kullanım sırasında, bazı kodlar bazı nesnelerde masum bir Modifiye özelliği ayarlar. Bu nesne, değişimi yakalayan ve tüm veri yapısı boyunca dalgalanan bildirimleri tetikleyen, kullanıcı arayüzünü manipüle eden, öngörülmesi zor şekillerde nesneleri oluşturan ve yok eden bir süper sınıftan gelir. Bu çok fazla olabilir - bildirimlerin beklenmedik sonuçları.

  • Bir çalışma sayfasını hücre hücre satır satır doldurma. Görünüşe göre satırı bir dizi değerden bir kerede oluşturursanız, çok daha hızlıdır.

PS Çok iş parçacıklıysanız, onu duraklattığınızda, tüm iş parçacıkları durur. Her iş parçacığının çağrı yığınına bir göz atın. Muhtemelen, bunlardan sadece biri gerçek suçludur ve diğerleri boşta.


2
Yorumlar? Yorumlar? BURASI SPARTA! Ben ... Üzgünüm, nereden geldiğini bilmiyorum. Hayır, kod Klingon Opera'yı okunabilir kılıyor ve aynı zamanda belgeleniyor. Aslında, çok daha az belgelendiğini düşünüyorum .... Aman Tanrım.
Jake Kurzer

3
QTMFC entegrasyonu? Harika, karmaşık ve kötü durumdasın ve henüz uygulamaya özel koda gelmedin.
Ben Voigt

5
QT / MFC? Bunun, duydukları en aptalca fikri duydukları her fikri çağırırken ileri geri sallanan 3 başlı mutant çocuklar üretmesi gerekmez mi? Errr ... Konu dışı ... MFC Soket sınıflarından herhangi birini kullanıyorsanız, hemen soket kodunuzu yeniden yazın ve ardından profili. CSocket kodunda, WaitForSingleObject'in performansı düşürmek için bulduğum mesaj döngüsü sürümünü kullanan ÇOK sayıda yer var. Hayatım boyunca bekle
işlevinin

2
Aman tanrım, güven bana, tam da düşündüğün kadar saçma.
Jake Kurzer

3
@Jake: Pek rahat değil, ama Turing evrenselliğinin ihtişamı bu. Ne kadar yüksek veya düşük seviyeli olursa olsun, herhangi bir dil, sınırsız suistimal kabiliyetinde eşdeğerdir.
Mike Dunlavey

8

AMD CodeAnalyst ile bazı başarılar elde ettim .


Şu anda Intel ortamı. Yine de aklımda tutacağım! :)
Jake Kurzer

4
@ Jake: Orada ne demek istediğinden emin değilim. AMD CodeAnalyst, AMD yongaları gerektirmez, Intel yongaları dahil çoğu x86 veya x64 (x86-64 / IA-64 / AMD64) yongalarında çalışmalıdır.
Adam Rosenfield

1
Görünüşe göre cahilim! Bu harika bir haber. Yarın deneyeceğim ve soruyu güncelleyeceğim.
Jake Kurzer

Şimdiye kadar, ihtiyacım olan çözünürlüklerde örnekleme yaparken çok istikrarsız.
Jake Kurzer

@Adam: Son zamanlarda bir intel pentium IV makinesinde kod analistini denedim ve yalnızca zamana dayalı örnekleme sundu, iş parçacığı kullanımı hakkında hiçbir bilgi veya iş parçacığı ile ilgili herhangi bir bilgi ... Aldığım bilgi miktarı gerçekten vasattı .. Ayrıca görsel stüdyonun qt entegrasyonunda çökmelere neden oldu .. memnun
kalmadım

7

MFC OnIdle işleviniz var mı? Geçmişte, bir PentiumD'nin ayak uydurabilmesi gereken 19.2K hızına ayarlandığında seri paketleri düşüren, neredeyse gerçek zamanlı bir uygulamam vardı. OnIdle işlevi bir şeyleri öldürüyordu. QT'nin bu konsepte sahip olup olmadığından emin değilim, ancak bunu da kontrol ederim.


2
Aslında bir OnIdle'ımız var ve QTMFC entegrasyonumuz sayesinde, QT ev..e ... eve ... olay döngüsünden geçiyor. Oh G'd.
Jake Kurzer

Bunun doğrudan bizim çözümümüze götürdüğü ortaya çıktı, bu yüzden soruya mükemmel bir cevap olmasa da, sorunun cevaplanamaz olduğunu düşünüyorum.
Jake Kurzer

4

VS Profiler'a bakın - bu kadar büyük dosyalar oluşturuyorsa, örnekleme aralığınız çok sık olabilir mi? Zaten muhtemelen yeterli numuneye sahip olduğunuz için onu düşürmeyi deneyin.

Ve ideal olarak, sorunlu alanı gerçekten deneyene kadar numune toplamadığınızdan emin olun. Bu nedenle, toplama işlemi duraklatılmış olarak başlayın, programınızın "yavaş etkinliğini" yapmasını sağlayın, ardından toplamaya başlayın. Sadece en fazla 20 saniyelik bir toplama işlemine ihtiyacınız var. Bundan sonra toplama işlemini durdurun.

Bu, örnek dosya boyutlarınızı azaltmanıza ve yalnızca analiziniz için gerekli olanı yakalamanıza yardımcı olur.


Buna yarın bir şans vereceğim.
Jake Kurzer

4

Windows için PurifyPlus'ı başarıyla kullandım . Ucuz olmasa da, IBM biraz sakat olan bir deneme sürümü sağlar. Birlikte profilleme için gereken tek şey ölçmek pdb dosyaları ile / SABİT bağlayan şunlardır: YOK. Tek dezavantaj: Win7 / 64 için destek yok.


Maalesef birincil hedefimiz Win7. Bu bilgiyi ana gönderiye ekleyeceğim.
Jake Kurzer

1
PurifyPlus'ın mevcut sürümü Win7 / 64'ü desteklemektedir.
hmuelner

3

Easyprofiler - Burada bahsettiğini henüz görmedim, bu yüzden daha önce bakıp bakmadığınızdan emin değilim. Metrik verileri nasıl topladığı konusunda biraz farklı bir yaklaşım gerektirir. Derleme zamanı profil yaklaşımını kullanmanın bir dezavantajı, kod tabanında değişiklik yapmanız gerektiğidir. Bu nedenle, yavaşlığın nerede olabileceği konusunda biraz fikir sahibi olmanız ve oraya profilleme kodunu eklemeniz gerekir.

Yine de son yorumlarınıza bakarsak, en azından biraz ilerleme kaydediyorsunuz gibi görünüyor. Belki de bu araç sizin için bazı yararlı ölçütler sağlayabilir. Başka hiçbir şey yoksa, gerçekten morumsu çizelgeler ve resimler var: P


3

İki araç önerisi daha.

Luke Stackwalker'ın sevimli bir adı var (zevkime göre biraz zor olsa bile), size hiçbir maliyeti olmayacak ve kaynak kodunu alacaksınız. Çok iş parçacıklı programları da desteklediğini iddia ediyor. Bu yüzden kesinlikle bir dönüşe değer.

http://lukestackwalker.sourceforge.net/

Ayrıca bana kullanmaya değer olduğunu belirttiğim Glowcode:

http://www.glowcode.com/

Ne yazık ki bir süredir herhangi bir PC çalışması yapmadım, bu yüzden ikisini de denemedim. Umarım öneriler yine de yardımcı olur.


3

Ödeme XPerf

Bu, MS tarafından sunulan ücretsiz, invazif olmayan ve genişletilebilir profilleyicidir. Microsoft tarafından Windows'un profilini çıkarmak için geliştirilmiştir.


3

Olay döngüsünden şüpheleniyorsanız, QCoreApplication :: notify () ve dosome manuel profillemeyi (sayım / zaman için bir veya iki gönderici / olay haritası ) geçersiz kılabilir mi?

Önce olay türlerinin sıklığını günlüğe kaydettiğinizi, ardından bu olayları daha dikkatli bir şekilde inceleyeceğinizi düşünüyorum (hangi nesne onu gönderiyor, ne içeriyor, vb.). İş parçacıkları arasındaki sinyaller örtük olarak sıraya alınır, bu nedenle olay döngüsünde son bulurlar (ayrıca açıkça sıraya alınmış bağlantılar da).

Olay işleyicilerimizde istisnaları tuzağa düşürmek ve raporlamak için yaptık, bu yüzden gerçekten, her olay oradan geçer.

Sadece bir fikir.


Bu çok güzel bir fikir! QT ortamına alışkın değilim, işimin çoğunu pyGTK ile baştan sona yaptığım için. Teşekkür ederim!
Jake Kurzer

Verilen sinyallerin yapısını bulmak ve çözmek için önerilen bir yolunuz var mı?
Jake Kurzer

Bunu yalnızca QStateMachine :: SignalEvent ile aynı görünmeyen sinyaller için yaptım. Kaynak yine de QObject* objectparametre olmalıdır . Belki MetaCall tüm sinyallerin türü (olası görünüyor), ancak emin değilim. Bu, deneyimlerimin biraz ötesine geçiyor, ancak Qt kaynağına göz atmak bazı gerçekleri toplayabilir. (Veya, burada SO'da sıraya alınmış sinyal çağrıları için daha anlamlı bir soru sorun .. :)
Macke

2

Düzenleme: İlk gönderinizde bundan bahsettiğinizi görüyorum. Kahretsin, o adam olacağımı hiç düşünmemiştim.

Kodunuzu daha ince ayrıntılarla kullanmak için Pin'i kullanabilirsiniz . Sanırım Pin, bir işleve kaç kez girdiğinizi veya orada kaç saat tetiği harcadığınızı saymak için bir araç oluşturmanıza izin verir, kabaca VTune veya CodeAnalyst gibi bir şeyi taklit eder. Daha sonra, zamanlama sorunlarınız ortadan kalkana kadar hangi işlevlerin kullanıldığını azaltabilirsiniz.


Aslında, PIN ilk ulaştığım şeydi. Aslında mükemmel olacak PIN Play denen bir şey var, ancak Intel dışında piyasaya sürülmek için değil. Gerçekten iyi bir şeyi bir araya getirmek için PIN'i kullanmayı yeterince hatırladığımdan emin değilim, ama ...
Jake Kurzer

2

Sana her gün ne kullandığımı söyleyebilirim.

a) AMD Kod Analisti

  • Kolaydır ve size neler olduğuna dair hızlı bir genel bakış sağlayacaktır. Çoğu zaman iyi olacak.
  • AMD CPU'ları ile size cpu pipeline hakkında bilgi verir, ancak buna yalnızca grafik motorlarında, video kodeklerinde vb. Olduğu gibi ağır döngüleriniz varsa ihtiyacınız olur.

b) VTune.

  • Vs2008'e çok iyi entegre edilmiştir

  • Etkin noktaları öğrendikten sonra, yalnızca zamanı değil, önbellek kayıpları ve bellek kullanımı gibi diğer şeyleri de örneklemeniz gerekir. Bu çok önemli . Bir örnekleme oturumu kurun ve özellikleri düzenleyin. Her zaman zaman, bellek okuma / yazma ve önbellek eksiklikleri için örnek alırım (üç farklı çalışma)

Ancak araçtan çok, profil oluşturma konusunda deneyim kazanmanız gerekir. Ve bu, CPU / Bellek / PCI'nin nasıl çalıştığını anlamak anlamına gelir ... yani bu benim 3. seçeneğim

c) Birim testi

Büyük performans gerektiren büyük bir uygulama geliştiriyorsanız bu çok önemlidir. Uygulamayı bazı parçalara bölemezseniz, cpu kullanımını izlemek zor olacaktır. Tüm vakaları ve sınıfları test etmiyorum, ancak kodlanmış yürütmelerim ve önemli özelliklere sahip girdi dosyalarım var.

Benim tavsiyem birkaç küçük testte rastgele örnekleme kullanmak ve bir profil stratejisini standartlaştırmaya çalışmak.


AMD Code Analyst, geliştirme ortamımda kararsız ve VTune bunu açıkça desteklemiyor. : S
Jake Kurzer

2

Tüm profil oluşturma ihtiyaçlarım için xperf / ETW kullanıyorum. Dik bir öğrenme eğrisine sahip ama inanılmaz derecede güçlü. Windows üzerinde profil oluşturuyorsanız, xperf bilmeniz gerekir. Bu profili sık sık kodumdaki ve diğer kişilerin kodundaki performans sorunlarını bulmak için kullanıyorum.

Kullandığım konfigürasyonda:

  • xperf, her msn'de kod çalıştıran her çekirdekten CPU örneklerini alır. Örnekleme hızı 8 KHz'e yükseltilebilir ve örnekler kullanıcı modu ve çekirdek kodunu içerir. Bu, bir iş parçacığının çalışırken ne yaptığını bulmayı sağlar
  • xperf her bağlam anahtarını kaydeder (her bir iş parçacığının ne kadar zaman kullandığının mükemmel bir şekilde yeniden yapılandırılmasına izin verir), ayrıca iş parçacığı açıldığında çağrı yığınları, ayrıca hangi iş parçacığının başka bir iş parçacığını hazırladığı için çağrı yığınları, bekleme zincirlerinin izlenmesine ve bir iş parçacığının nedenini bulmaya izin verir çalışmıyor
  • xperf, tüm işlemlerden tüm dosya G / Ç'lerini kaydeder
  • xperf, tüm işlemlerden tüm disk G / Ç'lerini kaydeder
  • xperf hangi pencerenin aktif olduğunu, CPU frekansını, CPU güç durumunu, UI gecikmelerini vb. kaydeder.
  • xperf ayrıca bir işlemden tüm yığın tahsislerini, tüm işlemlerden tüm sanal ayırmaları ve çok daha fazlasını kaydedebilir.

Bu, tüm süreçler için hepsi tek bir zaman çizelgesindeki çok fazla veri. Windows'taki başka hiçbir profilleyici bunu yapamaz.

Xperf / ETW'nin nasıl kullanılacağı hakkında kapsamlı bir şekilde blog yazdım. Bu blog gönderileri ve bazı profesyonel kalitede eğitim videoları burada bulunabilir: http://randomascii.wordpress.com/2014/08/19/etw-training-videos-available-now/

Xperf kullanmazsanız neler olabileceğini öğrenmek istiyorsanız şu blog gönderilerini okuyun: http://randomascii.wordpress.com/category/investigative-reporting/ Bunlar, başkalarının kodlarında bulduğum performans sorunları hikayeleridir. , geliştiriciler tarafından bulunmalıydı. Bu, VC ++ derleyicisine yüklenen mshtml.dll'yi, VC ++ 'ın dosyalarında bulmada bir hizmet reddi, şaşırtıcı sayıda müşteri makinesinde termal kısıtlamayı, Visual Studio'da yavaş tek adımlamayı, bir donanımda 4 GB ayırmayı içerir. disk sürücüsü, bir powerpoint performans hatası ve daha fazlası.


1

C ++ için taşınabilir manuel enstrümantasyonlu profil oluşturma kitaplığı olan CxxProf'un ilk kullanılabilir sürümünü yeni bitirdim .

Aşağıdaki hedefleri yerine getirir:

  • Kolay entegrasyon
  • Derleme sırasında kitaplığı kolayca kaldırın
  • Çalışma sırasında kitaplığı kolayca kaldırın
  • Çok iş parçacıklı uygulamalar için destek
  • Dağıtılmış sistemler için destek
  • Etkiyi minimumda tutun

Bu noktalar proje wikisinden koparıldı, daha fazla ayrıntı için oraya bir göz atın.

Feragatname: CxxProf'un ana geliştiricisiyim


1

Tam anlamıyla bir profil oluşturucu olmasa bile, sadece atmak için: eğer peşinde olduğunuz tek şey bir olayı işlemek uzun süren askıda olay döngüleri, geçici bir araçsa Qt'de basit bir konudur. Bu yaklaşım, her bir olayın işlenmesinin ne kadar sürdüğünü ve bu olayların ne olduğunu vb. Takip etmek için kolayca genişletilebilir. Bu evrensel bir profilleyici değil, olay döngüsü merkezli bir profildir.

Qt'de, tüm çapraz iş parçacıklı sinyal yuvası çağrıları, zamanlayıcılar, ağ ve seri bağlantı noktası bildirimleri ve tüm kullanıcı etkileşimi gibi olay döngüsü aracılığıyla iletilir. Bu nedenle, olay döngülerini gözlemlemek, uygulamanın zamanını nerede geçirdiğini anlamak için büyük bir adımdır.


0

Başlangıçta NuMega tarafından geliştirilen ve şimdi MicroFocus tarafından dağıtılan DevPartner, bir zamanlar profil oluşturma ve kod analizi (örneğin bellek ve kaynak sızıntıları) için tercih edilen çözümdü. Son zamanlarda denemedim, bu yüzden size yardımcı olacağından emin olamam; ancak bir zamanlar bununla mükemmel sonuçlar elde ettim, bu nedenle bu, kod kalitesi sürecimizde yeniden yüklemeyi düşündüğüm bir alternatiftir (14 günlük bir deneme sağlıyorlar)


0

işletim sisteminiz win7 olsa da, program xp altında çalışamıyor mu? peki ya xp altında profili ve sonuç win7 için bir ipucu olmalı.


Elbette olabilir, ancak bu, istediğiniz geliştirme ortamını hiçbir zaman iyi desteklemeyen bir ürün için bir lisans satın almayı gerektirir veya bunu yapmak yıllar alabilir. 1.5k, bahse girmek için çok para, artı bir xp kutusunu görüntüleme ve yerleştirme zamanındaki maliyetler.
Jake Kurzer

0

Burada listelenen birçok profil oluşturucu var ve bunlardan birkaçını kendim denedim - ancak buna dayanarak kendi yazımı yazdım:

http://code.google.com/p/high-performance-cplusplus-profiler/

Elbette kod tabanını değiştirmenizi gerektirir, ancak darboğazları azaltmak için mükemmeldir, tüm x86'larda çalışmalıdır (çok çekirdekli kutularda bir sorun olabilir, yani rdtsc kullanır, ancak - bu yine de tamamen gösterge zamanlama içindir. - bu yüzden ihtiyaçlarım için yeterli buluyorum ..)



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.