Apa perbedaan antara sjlj vs dwarf vs seh?

147

Saya tidak dapat menemukan informasi yang cukup untuk memutuskan kompiler mana yang harus saya gunakan untuk mengkompilasi proyek saya. Ada beberapa program pada komputer yang berbeda yang mensimulasikan suatu proses. Di Linux, saya menggunakan GCC. Semuanya bagus. Saya dapat mengoptimalkan kode, mengkompilasi dengan cepat dan menggunakan memori yang tidak terlalu banyak.

Saya melakukan benchmark sendiri dengan kompiler MSVC dan GCC. Kemudian satu menghasilkan binari sedikit lebih cepat (untuk setiap subarsitektur). Padahal waktu kompilasi jauh lebih banyak daripada MSVC.

Jadi saya memutuskan untuk menggunakan MinGW. Tetapi tidak dapat menemukan penjelasan tentang metode penanganan pengecualian dan implementasinya di MinGW. Saya dapat menggunakan distribusi yang berbeda untuk sistem operasi dan arsitektur yang berbeda.

Pertimbangan:

  • Kompilasi waktu dan memori tidak penting untuk penggunaan saya. Satu-satunya hal yang penting adalah optimasi runtime. Saya perlu program saya cukup cepat. Kompiler lambat dapat diterima.
  • OS: Microsoft Windows XP / 7/8 / Linux
  • Arsitektur: Intel Core i7 / Core2 / dan i686 yang sangat lama menjalankan XP: P
sorush-r
sumber
5
Saya terkejut gcc menghasilkan kode lebih cepat dari MSVC; pasti ada yang berubah dalam beberapa tahun terakhir ...
trojanfoe
19
@trojanfoe Saya sudah berkali-kali diberitahu untuk menggunakan MSVC daripada MinGW. Semua orang berpikir msvc lebih cepat! Saya menguji MinGW 7.2 dan MSVC 2010. dengan program cpu-burst sederhana. Pada corei7 dengan -O3 -mtune=corei7GCC adalah 45% lebih cepat dari MSVC
sorush-r
5
Dalam pengalaman saya sendiri, dengan generator catur (yang menggunakan bitboard), baik MSVC dan Intel C ++ 10% lebih cepat dari gcc, tapi itu 2 tahun yang lalu ...
trojanfoe
2
@ Serigala Pada saat itu 45% lebih cepat berarti 45% lebih sedikit waktu untuk mengeksekusi untuk saya. Jika saya ingat dengan benar, waktu eksekusi perangkat lunak pemodelan geometri molekul kami adalah 134s (gcc) dan 194s (msvc) untuk pengujian tertentu. Namun demikian sekarang saya menganggap metode pengukuran saya salah dan tidak cukup (:
sorush-r
2
@ Sorush-r Saya mengerti, Anda menghitung (194-134) / 134 yang dekat 45%, terima kasih.
Wolf

Jawaban:

109

Ada gambaran singkat di MinGW-w64 Wiki :

Mengapa mingw-w64 gcc tidak mendukung Pengecualian Dwarf-2?

The Dwarf-2 EH implementasi untuk Windows tidak dirancang sama sekali untuk bekerja di bawah aplikasi 64-bit Windows. Dalam mode win32, penangan pengendali pelepasan tidak dapat menyebar melalui kode yang tidak dikenali oleh dw2, ini berarti bahwa pengecualian apa pun yang melewati kode "bingkai asing" yang tidak dikenali akan gagal, termasuk sistem Windows DLL dan DLL yang dibangun dengan Visual Studio. Kode pelonggaran kerdil-2 di gcc memeriksa rakitan pelonggaran x86 dan tidak dapat melanjutkan tanpa informasi pelepasan kerdil-2 lainnya.

Metode SetJump LongJump penanganan pengecualian bekerja untuk sebagian besar kasus pada win32 dan win64, kecuali untuk kesalahan perlindungan umum. Dukungan penanganan terstruktur pengecualian dalam gcc sedang dikembangkan untuk mengatasi kelemahan dw2 dan sjlj. Pada win64, informasi pelepasan ditempatkan di bagian xdata dan ada .pdata (tabel deskriptor fungsi) bukan tumpukan. Untuk win32, rantai penangan berada di tumpukan dan perlu disimpan / dipulihkan oleh kode yang dieksekusi nyata.

GCC GNU tentang Penanganan Pengecualian :

GCC mendukung dua metode untuk penanganan pengecualian (EH):

  • DWARF-2 (DW2) EH , yang membutuhkan penggunaan informasi debug DWARF-2 (atau DWARF-3). DW-2 EH dapat menyebabkan file executable sedikit membengkak karena tabel panggilan tumpukan besar harus dimasukkan dalam file executable.
  • Metode yang didasarkan pada setjmp / longjmp (SJLJ) . EH berbasis SJLJ jauh lebih lambat daripada DW2 EH (menghukum eksekusi yang normal bahkan ketika tidak ada pengecualian yang dilemparkan), tetapi dapat bekerja lintas kode yang belum dikompilasi dengan GCC atau yang tidak memiliki informasi pemanggilan tumpukan-tumpukan.

[...]

Structured Exception Handling (SEH)

Windows menggunakan mekanisme penanganan pengecualiannya sendiri yang dikenal sebagai Structured Exception Handling (SEH). [...] Sayangnya, GCC belum mendukung SEH. [...]

Lihat juga:

ollo
sumber
7
Terima kasih atas tautannya. Saya akan menggunakan DW2 untuk 32bit dan SEH untuk 64. SEH tersedia dalam mingwbuilds (4.8). Haruskah saya menunggu rilis stabil 4,8 atau tidak apa-apa? Itu mengkompilasi di sini. Saat ini saya membuat dependensi proyek saya menggunakan 4,8 dengan SEH. Belum ada masalah ...
sorush-r
2
Semua dependensi (termasuk Boost library, OpenSSL, ICU, freeGLUT) dikompilasi tetapi Qt berakhir dengan banyak kesalahan kompiler internal. Saya pikir saya akan menunggu rilis stabil 4,8
sorush-r
Apakah Anda menggunakan binari qt atau Anda kompilasi sendiri?
4
@ Korea Saya menggunakan build Qt saya sendiri. Saya menemukan bahwa tidak ada masalah dengan Qt maupun GCC 4.8. Itu adalah RAM saya yang setengah terbakar! 1 Sekarang semuanya berfungsi dengan baik
sorush-r
82

SJLJ (setjmp / longjmp): - tersedia untuk 32 bit dan 64 bit - bukan "nol biaya": bahkan jika pengecualian tidak dilemparkan, itu menimbulkan penalti kinerja kecil (~ 15% dalam pengecualian kode berat) - memungkinkan pengecualian untuk melintasi misalnya jendela panggilan balik

DWARF (DW2, dwarf-2) - hanya tersedia untuk 32 bit - tidak ada overhead runtime permanen - membutuhkan seluruh panggilan stack untuk diaktifkan kerdil, yang berarti pengecualian tidak dapat dilemparkan ke atas misalnya sistem DLL Windows.

SEH (pengecualian overhead nol) - akan tersedia untuk 64-bit GCC 4.8.

sumber: http://qt-project.org/wiki/MinGW-64-bit


sumber
2
Maaf, tautan sumber ditambahkan.
2
Terima kasih atas jawaban Anda;)
sorush-r
14
Jadi sekarang pada tahun 2016 kita dapat mengistirahatkan pertanyaan ini dan selalu menggunakan SEH.
rustyx
6
@RustyX Hanya jika target Anda adalah x86_64
sohnryang
Jadi Dwarf untuk x86?
banguru