Pertanyaan Apakah program dikompilasi dengan -g gcc flag lebih lambat dari program yang sama dikompilasi tanpa -g?


Saya menyusun program dengan -O3 untuk kinerja dan -g untuk simbol debug (jika terjadi crash saya dapat menggunakan dump inti). Satu hal yang mengganggu saya, apakah opsi -g menghasilkan penalti kinerja? Ketika saya melihat output kompilasi dengan dan tanpa -g, saya melihat bahwa output tanpa -g adalah 80% lebih kecil dari output kompilasi dengan -g. Jika ruang ekstra berlaku untuk simbol debug, saya tidak peduli (saya kira) karena bagian ini tidak digunakan selama waktu proses. Tetapi jika untuk setiap instruksi dalam output kompilasi tanpa -g saya perlu melakukan 4 instruksi lebih banyak dalam output kompilasi dengan -g daripada saya pasti lebih suka berhenti menggunakan opsi -g bahkan dengan biaya tidak dapat memproses core dumps.

Bagaimana mengetahui ukuran bagian simbol debug di dalam program dan secara umum melakukan kompilasi dengan -g membuat program yang berjalan lebih lambat dari kode yang sama dikompilasi tanpa -g?


32
2018-06-09 09:12


asal


Jawaban:


Mengutip dari dokumentasi gcc

GCC memungkinkan Anda untuk menggunakan -g dengan -O. Pintasan yang diambil oleh dioptimalkan   kode kadang-kadang dapat menghasilkan hasil yang mengejutkan: beberapa variabel Anda   dideklarasikan mungkin tidak ada sama sekali; aliran kontrol dapat bergerak secara singkat di mana   Anda tidak mengharapkannya; beberapa pernyataan mungkin tidak dieksekusi karena   mereka menghitung hasil konstan atau nilai-nilai mereka sudah di tangan;   beberapa pernyataan dapat dilakukan di tempat yang berbeda karena telah   pindah dari loop.

itu berarti:

Saya akan memasukkan simbol-simbol debug untuk Anda tetapi saya tidak akan mencoba untuk mempertahankannya jika lulus lulus optimasi mereka, Anda harus berurusan dengan itu

Simbol debugging tidak ditulis ke dalam kode tetapi ke bagian lain yang disebut "bagian debug" yang bahkan tidak dimuat saat runtime (hanya oleh debugger). Itu artinya: tidak ada perubahan kode. Anda tidak akan melihat perbedaan kinerja dalam kecepatan eksekusi kode tetapi Anda mungkin mengalami kelambatan jika loader perlu menangani biner yang lebih besar atau jika memperhitungkan ukuran biner yang meningkat entah bagaimana. Anda mungkin harus menaksir sendiri aplikasi untuk menjadi 100% pasti dalam kasus spesifik Anda.

Perhatikan bahwa ada juga pilihan lain dari gcc 4.8:

-Og

Optimalkan pengalaman debugging. -Og memungkinkan pengoptimalan yang tidak mengganggu proses debug. Ini harus menjadi tingkat pengoptimalan pilihan untuk siklus edit-kompilasi-debug standar, menawarkan tingkat pengoptimalan yang wajar sambil mempertahankan kompilasi yang cepat dan pengalaman debugging yang baik.

Bendera ini akan berdampak pada kinerja karena akan menonaktifkan pengoptimalan apa pun yang akan mengganggu proses debug infos.

Akhirnya, itu mungkin bahkan terjadi bahwa beberapa optimasi lebih sesuai untuk arsitektur tertentu daripada yang lain dan kecuali diperintahkan untuk melakukannya untuk prosesor khusus Anda (lihat march / mtune pilihan untuk arsitektur Anda), di O3 gcc akan dilakukan yang terbaik untuk arsitektur umum. Itu berarti Anda bahkan mungkin mengalami O3 menjadi lebih lambat daripada O2 dalam beberapa skenario yang dibuat-buat. "Usaha terbaik" tidak selalu berarti "yang terbaik yang tersedia".


46
2018-06-09 09:17