Beyond Stack Sampling: C ++ Profilers

146

Kisah Seorang Peretas

Tanggalnya adalah 12/02/10. Hari-hari sebelum Natal menetes dan saya sudah cukup menghantam penghambat utama program windows. Saya telah menggunakan AQTime, saya sudah mencoba mengantuk, mengkilap, dan sangat mengantuk, dan ketika kita berbicara, VTune sedang menginstal. Saya sudah mencoba menggunakan profiler VS2008, dan itu sudah menghukum positif dan sering tidak masuk akal. Saya telah menggunakan teknik jeda acak. Saya telah memeriksa pohon panggilan. Saya telah melepaskan jejak fungsi. Tetapi fakta menyedihkan yang menyedihkan dari masalah ini adalah bahwa aplikasi yang saya kerjakan adalah lebih dari satu juta baris kode, dengan kemungkinan satu juta baris lainnya dari aplikasi pihak ketiga.

Saya membutuhkan alat yang lebih baik. Saya sudah membaca topik lainnya. Saya sudah mencoba setiap profiler yang tercantum dalam setiap topik. Hanya harus ada sesuatu yang lebih baik daripada opsi-opsi yang jelek dan mahal ini, atau jumlah pekerjaan yang menggelikan untuk hampir tidak ada keuntungan. Untuk lebih memperumit masalah, kode kami sangat di-threaded, dan menjalankan sejumlah loop Peristiwa Qt, beberapa di antaranya sangat rapuh sehingga mereka jatuh di bawah instrumentasi berat karena penundaan waktu. Jangan tanya kenapa kami menjalankan banyak loop acara. Tidak ada yang bisa memberitahuku.

Apakah ada opsi lain di sepanjang garis Valgrind di lingkungan windows?
Apakah ada yang lebih baik daripada petak panjang alat rusak yang sudah saya coba?
Apakah ada sesuatu yang dirancang untuk diintegrasikan dengan Qt, mungkin dengan tampilan peristiwa yang berguna dalam antrian?

Daftar lengkap alat yang saya coba, dengan yang sangat berguna dalam cetak miring:

  • AQTime: Agak bagus! Ada beberapa masalah dengan rekursi yang dalam, tetapi grafik panggilannya benar dalam kasus ini, dan dapat digunakan untuk menjernihkan kebingungan yang mungkin Anda miliki. Bukan alat yang sempurna, tetapi patut dicoba. Mungkin cocok dengan kebutuhan Anda, dan itu tentu saja cukup baik untuk saya hampir sepanjang waktu.
  • Serangan Jeda acak dalam mode debug: Tidak cukup informasi yang cukup waktu.
    Alat yang bagus tapi bukan solusi lengkap.
  • Parallel Studios: Opsi nuklir. Obtrusif, aneh, dan kuat sekali. Saya pikir Anda harus memulai evaluasi 30 hari, dan mencari tahu apakah itu cocok. Ini sangat keren juga.
  • AMD Codeanalyst: Luar biasa, mudah digunakan, sangat rawan kecelakaan, tapi saya pikir itu masalah lingkungan. Saya akan merekomendasikan mencobanya, karena gratis.
  • Luke Stackwalker: Bekerja dengan baik pada proyek-proyek kecil, ini sedikit mencoba membuatnya bekerja pada kita. Namun beberapa hasil yang baik, dan itu pasti menggantikan Sleepy untuk tugas pribadi saya.
  • PurifyPlus: Tidak ada dukungan untuk lingkungan Win-x64, paling menonjol Windows 7. Sebaliknya sangat baik. Sejumlah rekan saya di departemen lain bersumpah demi hal itu.
  • VS2008 Profiler: Menghasilkan output dalam kisaran 100+ gigs dalam mode fungsi jejak pada resolusi yang diperlukan. Di sisi positifnya, menghasilkan hasil yang solid.
  • GProf: Memerlukan GCC agar cukup efektif.
  • VTune: Dukungan W7 VTune berbatasan dengan kriminal. Sangat bagus
  • PIN: Saya perlu meretas alat saya sendiri, jadi ini adalah pilihan terakhir.
  • Sleepy \ VerySleepy: Berguna untuk aplikasi yang lebih kecil, tetapi gagal saya di sini.
  • EasyProfiler: Tidak buruk jika Anda tidak keberatan sedikit kode yang disuntikkan secara manual untuk menunjukkan tempat instrumen.
  • Valgrind: * nix saja, tetapi sangat bagus ketika Anda berada di lingkungan itu.
  • OProfile: Linux saja.
  • Untung: Mereka menembak kuda liar.

Alat yang disarankan yang belum saya coba:

  • XPerf:
  • Kode cahaya:
  • Devpartner:

Catatan: Lingkungan Intel saat ini. VS2008, tingkatkan perpustakaan. Qt 4+. Dan pelacur celaka dari semuanya: Integrasi Qt / MFC via trolltech.


Sekarang: Hampir dua minggu kemudian, sepertinya masalah saya teratasi. Berkat berbagai alat, termasuk hampir semua yang ada di daftar dan beberapa trik pribadi saya, kami menemukan hambatan utama. Namun, saya akan terus menguji, mengeksplorasi, dan mencoba profiler baru serta teknologi baru. Mengapa? Karena aku berhutang kepada kalian, karena kalian congkak. Memang sedikit memperlambat timeline, tapi saya masih sangat bersemangat untuk terus mencoba alat baru.

Sinopsis
Di antara banyak masalah lain, sejumlah komponen baru-baru ini telah beralih ke model threading yang salah, menyebabkan hang-up serius karena fakta bahwa kode di bawah kami tiba-tiba tidak lagi multithreaded. Saya tidak bisa mengatakan lebih karena itu melanggar NDA saya, tetapi saya dapat memberitahu Anda bahwa ini tidak akan pernah ditemukan dengan inspeksi biasa atau bahkan oleh tinjauan kode normal. Tanpa profiler, kaligraf, dan jeda acak bersamaan, kita masih akan berteriak kemarahan kita pada busur biru indah dari langit. Untungnya, saya bekerja dengan beberapa peretas terbaik yang pernah saya temui, dan saya memiliki akses ke ayat luar biasa yang penuh dengan alat-alat hebat dan orang-orang hebat.

Gentlefolk, saya sangat menghargai ini, dan hanya menyesal bahwa saya tidak memiliki cukup perwakilan untuk memberi Anda masing-masing hadiah. Saya masih berpikir ini adalah pertanyaan penting untuk mendapatkan jawaban yang lebih baik daripada yang kita punya sejauh ini di SO.

Akibatnya, setiap minggu selama tiga minggu ke depan, saya akan memberikan hadiah terbesar yang saya mampu, dan memberikannya kepada jawaban dengan alat terbaik yang saya pikir bukan pengetahuan umum. Setelah tiga minggu, semoga kami telah mengumpulkan profil yang pasti dari para profiler, jika Anda akan mengampuni hukuman saya.

Take-away
Gunakan profiler. Mereka cukup baik untuk Ritchie, Kernighan, Bentley, dan Knuth. Saya tidak peduli siapa Anda pikir Anda. Gunakan profiler. Jika yang Anda punya tidak berfungsi, temukan yang lain. Jika Anda tidak dapat menemukannya, kode satu. Jika Anda tidak dapat mengkodekannya, atau hanya hang up kecil, atau Anda hanya terjebak, gunakan jeda acak. Jika semuanya gagal, rekrut beberapa mahasiswa pascasarjana untuk membuat profiler.


Pandangan yang Lebih Panjang
Jadi, saya pikir mungkin baik untuk menulis sedikit retrospektif. Saya memilih untuk bekerja secara luas dengan Parallel Studios, sebagian karena sebenarnya dibangun di atas PIN Tool. Setelah memiliki hubungan akademik dengan beberapa peneliti yang terlibat, saya merasa bahwa ini mungkin suatu tanda kualitas tertentu. Syukurlah, saya benar. Sementara GUI agak mengerikan, saya menemukan IPS sangat berguna, meskipun saya tidak bisa dengan nyaman merekomendasikannya untuk semua orang. Secara kritis, tidak ada cara yang jelas untuk mendapatkan jumlah hit level-line, sesuatu yang disediakan AQT dan sejumlah profiler lain, dan saya telah menemukan sangat berguna untuk memeriksa tingkat pemilihan cabang di antara hal-hal lain. Di internet, saya menikmati menggunakan AQTime juga, dan saya menemukan dukungan mereka sangat responsif. Sekali lagi, saya harus memenuhi syarat rekomendasi saya: Banyak fitur mereka tidak bekerja dengan baik, dan beberapa dari mereka benar-benar rentan terhadap Win7x64. XPerf juga tampil mengagumkan, tetapi sangat lambat untuk detail pengambilan sampel yang diperlukan untuk mendapatkan pembacaan yang baik pada jenis aplikasi tertentu.

Saat ini, saya harus mengatakan bahwa saya tidak berpikir ada opsi yang pasti untuk profiling kode C ++ di lingkungan W7x64, tetapi tentu saja ada opsi yang gagal menjalankan layanan yang berguna.

Jake Kurzer
sumber
18
Sudahkah Anda mencari pekerjaan yang berbeda? :)
Nikolai Fetissov
10
Di mana lagi saya bisa menyelesaikan teka-teki ini dengan keras? Saya kira saya bisa kembali ke peretasan kernel, tetapi itu tidak membayar juga.
Jake Kurzer
3
@Kos Saya pikir agar gprof berguna, Anda harus menggunakan gcc toolset yang dikompilasi dengan -pg jika tidak akan menghasilkan file gprof.out. Dalam kasus OP sepertinya ia menggunakan msvc yang mengesampingkan penggunaan gprof. Kemudian lagi saya tidak berpikir gprof akan adil lebih baik baginya jika yang lain dalam daftar gagal memenuhi kebutuhannya
greatwolf
2
@Marc Gravell Itu cukup adil, saya kira .... Tampaknya heuristik aneh bagi saya, bahwa posting yang paling terawat dengan baik tiba-tiba masuk ke domain komunitas, secara efektif menghasilkan situasi di mana semakin Anda memperbarui dan mempertahankan pertanyaan atau jawaban Anda , semakin sedikit Anda keluar dari pemeliharaan itu di mata masyarakat luas. Haruskah saya mengambil ini sebagai meta?
Jake Kurzer
2
Adakah yang menginginkan retrospektif, mengingat apa yang sekarang saya ketahui tentang profiler?
Jake Kurzer

Jawaban:

65

Pertama:

Profiler pengambilan sampel waktu lebih kuat daripada profiler pengambilan sampel CPU. Saya tidak terlalu terbiasa dengan alat pengembangan Windows jadi saya tidak bisa mengatakan yang mana. Sebagian besar profiler adalah pengambilan sampel CPU.

Profiler pengambilan sampel CPU mengambil jejak tumpukan setiap N instruksi.
Teknik ini akan mengungkapkan bagian dari kode Anda yang terikat CPU. Yang luar biasa jika itu adalah leher botol dalam aplikasi Anda. Tidak terlalu bagus jika utas aplikasi Anda menghabiskan sebagian besar waktu mereka berebut mutex.

Profiler pengambilan sampel waktu mengambil jejak tumpukan setiap N mikrodetik.
Teknik ini akan nol pada kode "lambat" . Apakah penyebabnya adalah CPU terikat, memblokir IO terikat, mutex terikat, atau cache meronta bagian dari kode Singkatnya apa yang pernah sepotong kode memperlambat aplikasi Anda akan menonjol.

Jadi gunakan profiler pengambilan sampel waktu jika memungkinkan terutama saat membuat profil kode ulir.

Kedua:

Pengambil sampel profiler menghasilkan sekumpulan data. Data ini sangat berguna, tetapi seringkali terlalu banyak untuk menjadi berguna dengan mudah. Visualizer data profil sangat membantu di sini. Alat terbaik yang saya temukan untuk visualisasi data profil adalah gprof2dot . Jangan biarkan namanya membodohi Anda, ia menangani semua jenis keluaran profiler pengambilan sampel (AQtime, Sleepy, XPerf, dll). Setelah visualisasi menunjukkan fungsi yang menyinggung, kembali ke data profil mentah untuk mendapatkan petunjuk yang lebih baik tentang apa penyebab sebenarnya.

Alat gprof2dot menghasilkan deskripsi titik grafik yang kemudian Anda masukkan ke alat graphviz . Output pada dasarnya adalah sebuah kaligrafi dengan fungsi yang diberi kode warna oleh dampaknya pada aplikasi. teks alternatif

Beberapa petunjuk untuk mendapatkan gprof2dot untuk menghasilkan output yang bagus.

  • Saya menggunakan --skew0,001 pada grafik saya sehingga saya dapat dengan mudah melihat jalur kode panas. Sebaliknya yang int main()mendominasi grafik.
  • Jika Anda melakukan sesuatu yang gila dengan template C ++ Anda mungkin ingin menambahkan --strip. Ini terutama benar dengan Boost.
  • Saya menggunakan OProfile untuk menghasilkan data pengambilan sampel saya. Untuk mendapatkan hasil yang baik saya perlu mengkonfigurasinya untuk memuat simbol debug dari perpustakaan pihak ke-3 dan sistem saya. Pastikan untuk melakukan hal yang sama, jika tidak Anda akan melihat bahwa CRT mengambil 20% dari waktu aplikasi Anda ketika apa yang sebenarnya terjadi mallocadalah menghancurkan tumpukan dan memakan hingga 15%.
deft_code
sumber
Walaupun saya tidak tahu bahwa ini adalah jawaban lengkap untuk masalah saya, gprof2dot telah memasuki gudang senjata saya yang luas, dan dengan cepat mengambil tempat favorit. Saya pikir itu layak hadiah!
Jake Kurzer
2
Saya mengajukan pertanyaan ini profiler berbasis sampel waktu Linux . OProfile seharusnya mendapatkan sampling berdasarkan waktu pada akhirnya. Mereka menghasilkan output berkualitas sangat tinggi, jadi begitu mereka menambahkan fitur itu saya akan menggunakannya. Selain itu saya punya teman hack bersama solusi gdb + backtrace untuk profil. Sangat berantakan, tetapi ia menemukan hambatan.
deft_code
@deft_code: "retas bersama-sama solusi gdb + backtrace untuk pembuatan profil. Sangat retas, tetapi ia memang menemukan kemacetan." Anda mengonfirmasi kata-kata kasar saya yang terus-menerus :) Beberapa orang ingin profiling menjadi cantik, tetapi jika hasilnya yang Anda butuhkan, ikuti yang berhasil, bukan yang cantik .
Mike Dunlavey
Saya setuju dengan Mike Dunlavey. Hal-hal seperti XPerf / WPA terlihat sangat cantik dan kuat, tetapi mencari tahu cara menggunakan alat ini membutuhkan waktu, dan pada akhirnya jeda acak sangat mudah dan memberikan informasi yang lebih baik untuk menyelesaikan masalah. Lebih banyak solusi otomatis tampaknya lebih sering menyaring informasi penting yang diperlukan untuk menyelesaikan kemacetan.
JDiMatteo
16

Apa yang terjadi ketika Anda mencoba menjeda secara acak? Saya menggunakannya setiap saat di aplikasi monster. Anda mengatakan itu tidak memberikan informasi yang cukup, dan Anda telah menyarankan Anda membutuhkan resolusi tinggi. Terkadang orang membutuhkan sedikit bantuan dalam memahami cara menggunakannya.

Apa yang saya lakukan, di bawah VS, adalah mengkonfigurasi tampilan stack sehingga tidak menunjukkan argumen fungsi, karena itu membuat tampilan stack benar-benar tidak dapat dibaca, IMO.

Lalu saya mengambil sekitar 10 sampel dengan menekan "jeda" selama waktu itu membuat saya menunggu . Saya menggunakan ^ A, ^ C, dan ^ V untuk menyalinnya ke notepad, untuk referensi. Kemudian saya mempelajari masing-masing, untuk mencoba mencari tahu apa itu dalam proses berusaha untuk mencapai pada saat itu.

Jika itu mencoba menyelesaikan sesuatu pada 2 sampel atau lebih, dan hal itu tidak sepenuhnya diperlukan, maka saya telah menemukan masalah langsung, dan saya tahu kira-kira berapa banyak perbaikan akan menghemat.

Ada hal-hal yang tidak perlu Anda ketahui, seperti persen yang tepat tidak penting, dan apa yang terjadi di dalam kode pihak ketiga tidak penting, karena Anda tidak dapat melakukan apa-apa tentang itu . Yang dapat Anda lakukan sesuatu adalah rangkaian kaya titik-panggilan dalam kode yang dapat Anda modifikasi yang ditampilkan pada setiap sampel tumpukan. Itu tempat berburu senangmu.

Contoh hal-hal yang saya temukan:

  • Selama startup, bisa sekitar 30 lapisan, dalam proses mencoba untuk mengekstraksi string karakter internasional dari sumber daya DLL. Jika string aktual diperiksa, dapat dengan mudah berubah bahwa string tidak benar-benar perlu diinternasionalkan, seperti string yang tidak pernah dilihat oleh pengguna.

  • Selama penggunaan normal, beberapa kode secara tidak sengaja menetapkan properti yang Dimodifikasi di beberapa objek. Objek itu berasal dari kelas-super yang menangkap perubahan dan memicu notifikasi yang mengacak-acak seluruh struktur data, memanipulasi UI, membuat dan merusak objek dengan cara yang sulit diramalkan. Ini bisa sering terjadi - konsekuensi pemberitahuan yang tidak terduga.

  • Mengisi lembar kerja baris demi baris, sel demi sel. Ternyata jika Anda membangun baris sekaligus, dari array nilai, itu jauh lebih cepat.

PS Jika Anda multi-utas, saat Anda menjeda, semua utas berhenti. Lihatlah tumpukan panggilan dari masing-masing utas. Kemungkinannya adalah, hanya satu dari mereka yang merupakan pelakunya, dan yang lainnya menganggur.

Mike Dunlavey
sumber
2
Komentar? Komentar? INI SPARTA! Aku ... Maaf, tidak tahu dari mana asalnya. Tidak, kodenya membuat Klingon Opera terlihat mudah dibaca, dan ini didokumentasikan dengan baik. Sebenarnya, saya pikir itu jauh lebih sedikit didokumentasikan .... Ya Tuhan.
Jake Kurzer
3
Integrasi QTMFC? Oh, bagus, Anda sudah rumit dan jahat , dan Anda bahkan belum sampai ke kode khusus aplikasi.
Ben Voigt
5
QT / MFC? Bukankah seharusnya itu menghasilkan anak-anak mutan dengan 3 kepala yang bergoyang-goyang sambil menyebut setiap ide yang pernah mereka dengar ide paling bodoh? Errr ... Saya ngelantur ... Jika Anda menggunakan salah satu kelas Socket MFC, segera tulis ulang kode soket Anda dan kemudian profil. Ada banyak tempat dalam kode CSocket yang menggunakan versi loop pesan dari WaitForSingleObject yang saya temukan untuk mematikan kinerja. Untuk kehidupan saya, saya tidak dapat mengingat nama fungsi tunggu ...: /
JimR
2
Ya Tuhan, percayalah, persis seperti yang kau pikirkan.
Jake Kurzer
3
@Jake: Tidak terlalu nyaman, tapi itulah kemuliaan Turing universalitas. Bahasa apa pun, tidak peduli seberapa tinggi atau rendahnya level, setara dengan kemampuannya yang tidak terbatas untuk disalahgunakan.
Mike Dunlavey
8

Saya sudah cukup sukses dengan AMD CodeAnalyst .

Adam Rosenfield
sumber
Lingkungan Intel, saat ini. Saya akan mengingatnya! :)
Jake Kurzer
4
@ Jake: Saya tidak yakin apa yang Anda maksud di sana. AMD CodeAnalyst tidak memerlukan chip AMD, itu harus bekerja pada kebanyakan x86 atau x64 (alias x86-64 / IA-64 / AMD64) chip, termasuk chip Intel.
Adam Rosenfield
1
Rupanya, saya buta huruf! Itu berita bagus. Saya akan mencobanya besok dan memperbarui pertanyaannya.
Jake Kurzer
Sejauh ini, sangat tidak stabil saat mengambil sampel pada resolusi yang saya butuhkan.
Jake Kurzer
@ Adam: Saya mencoba analis kode pada mesin intel pentium IV baru-baru ini, dan itu hanya menawarkan pengambilan sampel berbasis waktu, tanpa informasi tentang penggunaan utas, atau informasi terkait utas sama sekali ... jumlah informasi yang saya dapatkan benar-benar biasa-biasa saja .. selain itu itu menyebabkan crash dalam integrasi qt dari studio visual .. saya tidak puas :(
smerlin
7

Apakah Anda memiliki fungsi MFC OnIdle? Di masa lalu saya memiliki aplikasi real-time yang dekat saya harus memperbaikinya yang menjatuhkan paket serial ketika ditetapkan pada kecepatan 19.2K yang seharusnya bisa dilakukan oleh PentiumD. Fungsi OnIdle adalah apa yang membunuh sesuatu. Saya tidak yakin apakah QT memiliki konsep itu, tetapi saya akan memeriksanya juga.

JimR
sumber
2
Kami sebenarnya memiliki OnIdle, dan berkat integrasi QTMFC kami, itu mengalir melalui QT ev..e ... eve ... event loop. Oh, akan.
Jake Kurzer
Ternyata ini mengarah langsung ke solusi kami, jadi sementara itu bukan jawaban yang sempurna untuk pertanyaan itu, saya pikir pertanyaan itu tidak bisa dijawab.
Jake Kurzer
4

Re the VS Profiler - jika itu menghasilkan file besar seperti itu, mungkin interval sampling Anda terlalu sering? Coba turunkan, karena Anda mungkin masih memiliki cukup sampel.

Dan idealnya, pastikan Anda tidak mengumpulkan sampel sampai Anda benar-benar berolahraga di area masalah. Jadi, mulailah dengan koleksi yang dijeda, dapatkan program Anda untuk melakukan "aktivitas lambat", lalu mulai pengumpulan. Anda hanya membutuhkan paling banyak 20 detik koleksi. Hentikan pengumpulan setelah ini.

Ini akan membantu mengurangi ukuran file sampel Anda, dan hanya menangkap apa yang diperlukan untuk analisis Anda.

Alex Budovski
sumber
Saya akan mencoba ini besok.
Jake Kurzer
4

Saya telah berhasil menggunakan PurifyPlus untuk Windows. Meskipun tidak murah, IBM menyediakan versi uji coba yang sedikit cacat. Yang Anda perlukan untuk membuat profil dengan kuantifikasi adalah file pdb dan menghubungkan dengan / FIXED: NO. Hanya kekurangannya: Tidak ada dukungan untuk Win7 / 64.

huelner
sumber
Sayangnya, target utama kami adalah Win7. Saya akan menambahkan info itu ke pos utama.
Jake Kurzer
1
Versi PurifyPlus saat ini mendukung Win7 / 64.
hmuelner
3

Easyprofiler - Saya belum melihatnya disebutkan di sini jadi tidak yakin apakah Anda sudah melihatnya. Dibutuhkan pendekatan yang sedikit berbeda dalam cara mengumpulkan data metrik. Kelemahan untuk menggunakan pendekatan profil waktu kompilasi adalah Anda harus membuat perubahan pada basis kode. Jadi, Anda harus memiliki ide tentang di mana yang lambat mungkin dan memasukkan kode profil di sana.

Pergi dengan komentar terbaru Anda meskipun, kedengarannya seperti Anda setidaknya membuat beberapa kemajuan. Mungkin alat ini dapat memberikan beberapa metrik yang berguna untuk Anda. Jika tidak ada yang lain, ia memiliki beberapa bagan dan gambar yang sangat murni: P

serigala besar
sumber
3

Dua saran alat lagi.

Luke Stackwalker memiliki nama yang lucu (bahkan jika itu berusaha sedikit untuk seleraku), itu tidak akan dikenakan biaya apa pun, dan Anda mendapatkan kode sumber. Ia mengklaim mendukung program multi-threaded juga. Jadi itu pasti layak diputar.

http://lukestackwalker.sourceforge.net/

Juga Glowcode, yang telah saya tunjukkan kepada saya sebagai layak digunakan:

http://www.glowcode.com/

Sayangnya saya belum melakukan pekerjaan PC untuk sementara waktu, jadi saya belum mencoba keduanya. Saya harap sarannya tetap membantu.


sumber
3

Periksa XPerf

Ini adalah profiler gratis, non-invasif dan dapat dikembangkan yang ditawarkan oleh MS. Ini dikembangkan oleh Microsoft untuk profil Windows.

Sanjit Saluja
sumber
3

Jika Anda curiga terhadap perulangan acara, dapatkah mengesampingkan QCoreApplication :: notify () dan dosome profiling manual (satu atau dua peta pengirim / acara untuk dihitung / waktu)?

Saya berpikir bahwa Anda pertama-tama mencatat frekuensi jenis peristiwa, kemudian memeriksa peristiwa-peristiwa itu lebih hati-hati (objek mana yang mengirimkannya, apa isinya, dll). Sinyal di utas di-antri secara implisit, sehingga berakhir di loop acara (juga koneksi antrian yang eksplisit, tentunya).

Kami telah melakukannya untuk menjebak dan melaporkan pengecualian di penangan acara kami, jadi sungguh, setiap peristiwa melewati sana.

Hanya sebuah ide.

Macke
sumber
Itu ide yang bagus! Saya tidak terbiasa dengan lingkungan QT, setelah melakukan sebagian besar pekerjaan saya dengan pyGTK di sini. Terima kasih!
Jake Kurzer
Apakah Anda memiliki cara yang disarankan untuk mencari dan menyelesaikan sifat dari sinyal yang diberikan?
Jake Kurzer
Saya hanya melakukannya untuk sinyal dengan QStateMachine :: SignalEvent, yang sepertinya tidak sama. Sumber masih harus menjadi QObject* objectparameter. Mungkin MetaCall adalah tipe untuk semua sinyal (sepertinya mungkin), tapi saya tidak yakin. Ini sedikit melampaui pengalaman saya, tetapi mengintip ke sumber Qt mungkin mendapatkan beberapa kebenaran. (Atau, ajukan pertanyaan yang lebih rancu dengan permintaan sinyal antrian di sini pada SO .. :)
Macke
2

Sunting: Saya mengerti sekarang Anda menyebutkan ini di posting pertama Anda. Sial, aku tidak pernah mengira aku akan menjadi pria itu.

Anda dapat menggunakan Pin untuk memasukkan kode Anda dengan rincian yang lebih baik. Saya pikir Pin akan membiarkan Anda membuat alat untuk menghitung berapa kali Anda memasukkan fungsi atau berapa banyak clockticks yang Anda habiskan di sana, kira-kira meniru sesuatu seperti VTune atau CodeAnalyst. Kemudian Anda bisa menghapus fungsi mana yang diinstrumentasi sampai masalah waktu Anda hilang.

Aaron Altman
sumber
Sebenarnya, PIN adalah tujuan pertama saya meraihnya. Sebenarnya ada sesuatu yang disebut PIN Play yang sempurna, tetapi ini bukan untuk rilis di luar Intel. Saya tidak yakin saya cukup ingat tentang penggunaan PIN untuk menyatukan sesuatu yang benar-benar bagus, tapi ...
Jake Kurzer
2

Saya bisa memberi tahu Anda apa yang saya gunakan setiap hari.

a) Analis Kode AMD

  • Itu mudah, dan itu akan memberi Anda gambaran singkat tentang apa yang terjadi. Akan baik-baik saja untuk sebagian besar waktu.
  • Dengan CPU AMD, ini akan memberi tahu Anda informasi tentang pipa cpu, tetapi Anda hanya perlu ini jika Anda memiliki loop berat, seperti di mesin grafis, codec video, dll.

b) VTune.

  • Ini sangat terintegrasi dengan baik pada vs2008

  • setelah Anda tahu hotspot, Anda perlu sampel tidak hanya waktu, tetapi hal-hal lain seperti cache hilang, dan penggunaan memori. Ini sangat penting . Siapkan sesi pengambilan sampel, dan edit properti. Saya selalu mencicipi waktu, memori baca / tulis, dan cache yang hilang (tiga kali jalan berbeda)

Tetapi lebih dari sekadar alat, Anda perlu mendapatkan pengalaman dengan profil. Dan itu berarti memahami cara kerja CPU / Memori / PCI ... jadi, ini adalah opsi ke-3 saya

c) Pengujian unit

Ini sangat penting jika Anda mengembangkan aplikasi besar yang membutuhkan kinerja besar. Jika Anda tidak dapat membagi aplikasi menjadi beberapa bagian, akan sulit untuk melacak penggunaan cpu. Saya tidak menguji semua case dan kelas, tetapi saya memiliki eksekusi hardcoded dan input file dengan fitur-fitur penting.

Saran saya menggunakan pengambilan sampel acak dalam beberapa tes kecil, dan cobalah untuk membakukan strategi profil.

Javier Loureiro
sumber
AMD Code Analyst tidak stabil di lingkungan dev saya, dan VTune secara eksplisit tidak mendukungnya. : S
Jake Kurzer
2

Saya menggunakan xperf / ETW untuk semua kebutuhan profil saya. Ini memiliki kurva belajar yang curam tetapi sangat kuat. Jika Anda membuat profil pada Windows maka Anda harus tahu xperf. Saya sering menggunakan profiler ini untuk menemukan masalah kinerja dalam kode saya dan kode orang lain.

Dalam konfigurasi yang saya gunakan:

  • xperf mengambil sampel CPU dari setiap inti yang mengeksekusi kode setiap ms. Laju pengambilan sampel dapat ditingkatkan menjadi 8 KHz dan sampel termasuk mode pengguna dan kode kernel. Ini memungkinkan mencari tahu apa yang sedang dilakukan utas saat sedang berjalan
  • xperf mencatat setiap saklar konteks (memungkinkan rekonstruksi sempurna dari berapa banyak waktu yang digunakan setiap thread), ditambah tumpukan panggilan saat thread diaktifkan, ditambah tumpukan panggilan untuk benang yang disiapkan oleh thread lain, memungkinkan pelacakan rantai tunggu dan mencari tahu mengapa sebuah thread tidak berjalan
  • xperf mencatat semua file I / O dari semua proses
  • xperf merekam semua disk I / O dari semua proses
  • xperf merekam jendela apa yang aktif, frekuensi CPU, status daya CPU, penundaan UI, dll.
  • xperf juga dapat merekam semua alokasi tumpukan dari satu proses, semua alokasi virtual dari semua proses, dan banyak lagi.

Itu banyak data, semua dalam satu timeline, untuk semua proses. Tidak ada profiler lain di Windows yang dapat melakukannya.

Saya telah membuat banyak blog tentang cara menggunakan xperf / ETW. Posting blog ini, dan beberapa video pelatihan berkualitas profesional, dapat ditemukan di sini: http://randomascii.wordpress.com/2014/08/19/etw-training-videos-available-now/

Jika Anda ingin mengetahui apa yang mungkin terjadi jika Anda tidak menggunakan xperf, baca posting blog ini: http://randomascii.wordpress.com/category/investigative-reporting/ Ini adalah kisah masalah kinerja yang saya temukan dalam kode orang lain , yang seharusnya ditemukan oleh pengembang. Ini termasuk mshtml.dll sedang dimuat ke dalam kompiler VC ++, penolakan layanan dalam find-in-file VC ++, pelambatan termal dalam sejumlah mesin pelanggan yang mengejutkan, lambat satu langkah di Visual Studio, alokasi 4 GB dalam hard- pengandar disk, bug kinerja powerpoint, dan banyak lagi.

Bruce Dawson
sumber
1

Saya baru saja menyelesaikan versi CxxProf yang dapat digunakan pertama kali , pustaka profil portabel yang diinstrumentasi manual untuk C ++.

Itu memenuhi tujuan-tujuan berikut:

  • Integrasi yang mudah
  • Mudah menghapus lib selama waktu kompilasi
  • Mudah menghapus lib selama runtime
  • Dukungan untuk aplikasi multithreaded
  • Dukungan untuk sistem terdistribusi
  • Pertahankan dampak minimum

Poin-poin ini diambil dari wiki proyek , lihat di sana untuk lebih jelasnya.

Penafian: Saya pengembang utama CxxProf

MOnsDaR
sumber
1

Hanya untuk membuangnya, meskipun itu bukan profiler lengkap: jika semua yang Anda cari adalah loop acara yang membutuhkan waktu lama untuk memproses suatu acara, alat ad-hoc adalah masalah sederhana di Qt. Pendekatan itu dapat dengan mudah diperluas untuk melacak berapa lama waktu yang dibutuhkan setiap peristiwa untuk diproses, dan apa peristiwa-peristiwa itu, dan seterusnya. Ini bukan profiler universal, tapi yang event-loop-centric.

Di Qt, semua panggilan slot-sinyal lintas-benang disampaikan melalui loop acara, seperti timer, pemberitahuan port serial dan jaringan, dan semua interaksi pengguna. Dengan demikian, mengamati loop acara adalah langkah besar menuju pemahaman di mana aplikasi menghabiskan waktunya.

Kuba Ober
sumber
0

DevPartner, awalnya dikembangkan oleh NuMega dan sekarang didistribusikan oleh MicroFocus, pernah menjadi solusi pilihan untuk profiling dan analisis kode (misalnya kebocoran memori dan sumber daya). Saya belum mencobanya baru-baru ini, jadi saya tidak dapat meyakinkan Anda bahwa itu akan membantu Anda; tapi saya pernah mendapatkan hasil yang sangat baik, sehingga ini merupakan alternatif yang saya pertimbangkan untuk menginstal ulang dalam proses kualitas kode kami (mereka menyediakan uji coba 14 hari)

Pascal T.
sumber
0

meskipun os Anda win7, program tidak dapat berjalan di bawah xp? bagaimana dengan profil di bawah xp dan hasilnya harus menjadi petunjuk untuk win7.

pengguna541633
sumber
Tentu saja bisa, tetapi itu membutuhkan pembelian lisensi untuk suatu produk yang mungkin tidak pernah mendukung dev yang Anda inginkan dengan baik, atau mungkin perlu bertahun-tahun untuk melakukannya. 1.5k adalah banyak uang untuk dipertaruhkan, ditambah biaya saat pencitraan dan penggunaan kotak xp.
Jake Kurzer
0

Ada banyak profiler yang terdaftar di sini dan saya sudah mencoba beberapa dari mereka sendiri - namun akhirnya saya menulis sendiri berdasarkan ini:

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

Itu tentu saja mengharuskan Anda memodifikasi basis kode, tapi itu sempurna untuk mempersempit kemacetan, harus bekerja pada semua x86s (bisa jadi masalah dengan kotak multi-core, yaitu menggunakan rdtsc, namun - ini murni untuk waktu indikatif saja - jadi saya merasa cukup untuk kebutuhan saya ..)

Nim
sumber