อะไรคือความแตกต่างระหว่าง sjlj vs dwarf vs seh?


147

ฉันหาข้อมูลไม่เพียงพอที่จะตัดสินใจว่าฉันควรใช้คอมไพเลอร์ใดในการรวบรวมโครงการของฉัน มีหลายโปรแกรมในคอมพิวเตอร์ที่ต่างกันจำลองกระบวนการ บน Linux ฉันใช้ GCC ทุกอย่างยอดเยี่ยม ฉันสามารถเพิ่มประสิทธิภาพรหัสมันรวบรวมอย่างรวดเร็วและใช้หน่วยความจำไม่มาก

ฉันทำมาตรฐานของตัวเองด้วยคอมไพเลอร์ MSVC และ GCC หลังจากนั้นหนึ่งสร้างไบนารีเร็วขึ้นเล็กน้อย (สำหรับแต่ละ subar Architecture) แม้ว่าเวลาในการรวบรวมจะมากกว่า MSVC

ดังนั้นฉันจึงตัดสินใจใช้ MinGW แต่ไม่พบคำอธิบายใด ๆ เกี่ยวกับวิธีการจัดการข้อยกเว้นและการใช้งานใน MinGW ฉันสามารถใช้การกระจายที่แตกต่างกันสำหรับระบบปฏิบัติการและสถาปัตยกรรมที่แตกต่างกัน

การพิจารณา:

  • เวลารวบรวมและหน่วยความจำไม่สำคัญสำหรับการใช้งานของฉัน สิ่งสำคัญเท่านั้นคือการปรับให้เหมาะสมแบบรันไทม์ ฉันต้องการโปรแกรมของฉันให้เร็วพอ คอมไพเลอร์ช้าเป็นที่ยอมรับ
  • ระบบปฏิบัติการ: Microsoft Windows XP / 7/8 / Linux
  • สถาปัตยกรรม: Intel Core i7 / Core2 / และ i686 รุ่นเก่าที่รัน XP: P

5
ฉันประหลาดใจ gcc ผลิตรหัสเร็วกว่า MSVC; สิ่งที่จะต้องมีการเปลี่ยนแปลงในช่วงไม่กี่ปีที่ผ่านมา ...
trojanfoe

19
@trojanfoe ฉันได้รับการบอกให้ใช้ MSVC หลายครั้งแทน MinGW ทุกคนคิดว่า msvc นั้นเร็วกว่า! ฉันทดสอบ MinGW 7.2 และ MSVC 2010 ด้วยโปรแกรม cpu-burst อย่างง่าย ใน corei7 กับ-O3 -mtune=corei7GCC เป็น 45% เร็วกว่า MSVC
sorush-r

5
ในประสบการณ์ของฉันเองกับตัวสร้างหมากรุกย้าย (ซึ่งใช้ bitboards) ทั้ง MSVC และ Intel C ++ เร็วกว่า gcc 10% แต่เมื่อ 2 ปีที่แล้ว ...
trojanfoe

2
@ หมาป่าในเวลานั้น 45% เร็วขึ้นหมายถึงเวลาน้อยลง 45% สำหรับฉัน ถ้าฉันจำได้อย่างถูกต้องเวลาดำเนินการของซอฟต์แวร์การสร้างแบบจำลองโมเลกุลของเราคือ 134s (gcc) และ 194s (msvc) สำหรับการทดสอบที่เฉพาะเจาะจง อย่างไรก็ตามตอนนี้ฉันคิดว่าวิธีการวัดของฉันไม่ถูกต้องและไม่เพียงพอ (:
sorush-r

2
@ sorush-r ฉันเข้าใจแล้วคุณคำนวณ (194-134) / 134 ซึ่งใกล้ 45% แล้วขอบคุณ
Wolf

คำตอบ:


109

มีภาพรวมสั้น ๆ ที่MinGW-w64 Wiki :

ทำไม mingw-w64 gcc ไม่รองรับการจัดการข้อยกเว้น Dwarf-2

การใช้งานDwarf-2 EHสำหรับ Windows นั้นไม่ได้รับการออกแบบมาให้ทำงานภายใต้แอปพลิเคชัน Windows แบบ 64 บิต ในโหมด win32 ข้อยกเว้นคลายตัวจัดการไม่สามารถเผยแพร่ผ่านรหัสที่ไม่ทราบ dw2 ซึ่งหมายความว่าข้อยกเว้นใด ๆ ที่เกิดขึ้นกับรหัส "เฟรมที่ไม่รู้จัก" ที่ไม่ใช่ dw2 ใด ๆ จะล้มเหลวรวมถึง DLL ของระบบ Windows และ DLL ที่สร้างขึ้นด้วย Visual Studio รหัสคลี่คลายของคนแคระ -2 ใน gcc ตรวจสอบชุดประกอบคลี่คลาย x86 และไม่สามารถดำเนินการต่อได้หากไม่มีข้อมูลคลายตัวของคนแคระ -2

SetJump LongJumpวิธีการในการจัดการงานสำหรับกรณีส่วนใหญ่ทั้ง win32 และ Win64 ยกเว้นยกเว้นสำหรับความผิดพลาดในการป้องกันทั่วไป โครงสร้างการรองรับการจัดการข้อยกเว้นใน gcc กำลังถูกพัฒนาเพื่อเอาชนะจุดอ่อนของ dw2 และ sjlj บน win64 ข้อมูลการผ่อนคลายจะอยู่ในส่วน xdata และมี. pdata (ตารางตัวอธิบายฟังก์ชั่น) แทนสแต็ก สำหรับ win32 โซ่ของตัวจัดการอยู่บนสแต็กและจำเป็นต้องได้รับการบันทึก / กู้คืนโดยรหัสที่ดำเนินการจริง

GCC GNUเกี่ยวกับการจัดการข้อยกเว้น :

GCC สนับสนุนวิธีการจัดการข้อยกเว้น (EH) สองวิธี:

  • DWARF-2 (DW2) EHซึ่งต้องการการใช้ข้อมูลการดีบัก DWARF-2 (หรือ DWARF-3) DW-2 EH สามารถทำให้โปรแกรมประมวลผลมีความป่องเล็กน้อยเนื่องจากตารางสแตกการโทรที่มีขนาดใหญ่จะต้องรวมอยู่ในโปรแกรมที่ทำงาน
  • วิธีการขึ้นอยู่กับsetjmp / longjmp (SJLJ) EH ที่อิง SJLJ นั้นช้ากว่า DW2 EH มาก (การลงโทษแม้การดำเนินการตามปกติเมื่อไม่มีข้อยกเว้นถูกโยนทิ้ง) แต่สามารถทำงานข้ามรหัสที่ไม่ได้รวบรวมกับ GCC หรือที่ไม่มีข้อมูลคลี่คลายการโทร

[ ... ]

การจัดการข้อยกเว้นเชิงโครงสร้าง (SEH)

Windows ใช้กลไกการจัดการข้อยกเว้นของตัวเองที่รู้จักกันในชื่อ Structured Exception Handling (SEH) [... ] น่าเสียดาย GCC ยังไม่สนับสนุน SEH [ ... ]

ดูสิ่งนี้ด้วย:


7
ขอบคุณสำหรับลิงค์ ฉันจะใช้ DW2 สำหรับ 32 บิตและ SEH สำหรับ 64 SEH มีให้ใน mingwbuilds (4.8) ฉันควรจะรอการปลดปล่อย 4.8 ที่เสถียรหรือไม่? มันรวบรวมที่นี่ ขณะนี้ฉันกำลังอ้างอิงโครงการของฉันโดยใช้ 4.8 กับ SEH ยังไม่มีปัญหา ...
sorush-r

2
การอ้างอิงทั้งหมด (รวมถึงห้องสมุด Boost, OpenSSL, ICU, freeGLUT) รวบรวมแล้ว แต่ Qt ท้ายด้วยข้อผิดพลาดภายในคอมไพเลอร์มากมาย ฉันคิดว่าฉันจะรอการปล่อยตัวที่เสถียร 4.8
sorush-r

คุณใช้ไบนารีของ qt หรือคุณรวบรวมโดยตัวคุณเอง?

4
@ ผู้หญิงฉันใช้งาน Qt build ของตัวเอง ฉันพบว่าไม่มีปัญหากับ Qt หรือ GCC 4.8 มันเป็น RAM ที่ถูกไฟไหม้ไปครึ่งหนึ่งของฉัน! 1ตอนนี้ทุกอย่างใช้งานได้ดี
sorush-r

82

SJLJ (setjmp / longjmp): - มีให้สำหรับ 32 บิตและ 64 บิต - ไม่ใช่“ zero-cost”: แม้ว่าข้อยกเว้นจะไม่ถูกโยนทิ้งก็จะเกิดโทษประสิทธิภาพเล็กน้อย (~ 15% ในรหัสข้อยกเว้นหนา) - อนุญาตข้อยกเว้น เพื่อสำรวจผ่านเช่น callbacks windows

DWARF (DW2, dwarf-2) - ใช้งานได้ 32 บิตเท่านั้น - ไม่มีโอเวอร์เฮดรันไทม์ถาวร - ต้องการ call stack ทั้งหมดเพื่อเปิดใช้งานคนแคระซึ่งหมายความว่าข้อยกเว้นไม่สามารถถูกโยนทิ้งได้เช่น Windows DLL ของระบบ

SEH (ไม่มีข้อยกเว้นค่าโสหุ้ย) - จะมีให้สำหรับ GCC 64 บิต 64 บิต

แหล่งที่มา: http://qt-project.org/wiki/MinGW-64-bit


2
ขออภัยลิงค์แหล่งข้อมูลถูกเพิ่ม

2
ขอบคุณสำหรับคำตอบของคุณ;)
sorush-r

14
ดังนั้นในปี 2559 เราสามารถวางคำถามนี้เพื่อพักผ่อนและใช้ SEH ได้ตลอดเวลา
rustyx

6
@RustyX เฉพาะในกรณีที่เป้าหมายของคุณคือ x86_64
sohnryang

ดังนั้นคนแคระสำหรับ x86?
banguru
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.