Sự khác biệt giữa sjlj vs lùn vs seh là gì?


147

Tôi không thể tìm thấy đủ thông tin để quyết định tôi nên sử dụng trình biên dịch nào để biên dịch dự án của mình. Có một số chương trình trên các máy tính khác nhau mô phỏng một quá trình. Trên Linux, tôi đang sử dụng GCC. Mọi thứ đều tuyệt vời. Tôi có thể tối ưu hóa mã, nó biên dịch nhanh và sử dụng bộ nhớ không quá nhiều.

Tôi làm điểm chuẩn của riêng mình với trình biên dịch MSVC và GCC. Sau này người ta tạo ra các nhị phân nhanh hơn một chút (cho mỗi kiến ​​trúc con). Mặc dù thời gian biên dịch nhiều hơn MSVC.

Vì vậy, tôi quyết định sử dụng MinGW. Nhưng không thể tìm thấy bất kỳ lời giải thích nào về các phương pháp xử lý ngoại lệ và việc triển khai chúng trong MinGW. Tôi có thể sử dụng các bản phân phối khác nhau cho các hệ điều hành và kiến ​​trúc khác nhau.

Cân nhắc:

  • Biên dịch thời gian và bộ nhớ không quan trọng đối với việc sử dụng của tôi. Chỉ có điều quan trọng là tối ưu hóa thời gian chạy. Tôi cần các chương trình của tôi đủ nhanh. Một trình biên dịch chậm là chấp nhận được.
  • HĐH: Microsoft Windows XP / 7/8 / Linux
  • Kiến trúc: Intel Core i7 / Core2 / và i686 rất cũ chạy XP: P

5
Tôi ngạc nhiên gcc tạo mã nhanh hơn MSVC; mọi thứ đã thay đổi trong vài năm qua ...
trojanfoe

19
@trojanfoe Tôi đã được khuyên sử dụng MSVC thay vì MinGW rất nhiều lần. Mọi người đều nghĩ msvc nhanh hơn! Tôi đã thử nghiệm MinGW 7.2 và MSVC 2010 với chương trình cpu-nổ đơn giản. Trên corei7 với -O3 -mtune=corei7GCC nhanh hơn 45% so với MSVC
sorush-r

5
Theo kinh nghiệm của riêng tôi, với một trình tạo cờ di chuyển (sử dụng bo mạch chủ), cả MSVC và Intel C ++ đều nhanh hơn 10% so với gcc, nhưng đó là 2 năm trước ...
trojanfoe

2
@Wolf Trong thời gian đó nhanh hơn 45% có nghĩa là thời gian thực thi cho tôi ít hơn 45%. Nếu tôi nhớ chính xác, thời gian thực hiện của phần mềm mô hình hình học phân tử của chúng tôi là 134 giây (gcc) và 194 giây (msvc) cho một thử nghiệm cụ thể. Tuy nhiên, bây giờ tôi coi phương pháp đo lường của mình là không chính xác và không đủ (:
sorush-r

2
@ sorush-r Tôi thấy, bạn đã tính (194-134) / 134 gần 45%, cảm ơn.
Sói

Câu trả lời:


109

Có một cái nhìn tổng quan ngắn tại MinGW-w64 Wiki :

Tại sao mingw-w64 gcc không hỗ trợ Xử lý ngoại lệ Dwarf-2?

Việc triển khai EH của Dwarf-2 cho Windows hoàn toàn không được thiết kế để hoạt động trong các ứng dụng Windows 64 bit. Trong chế độ win32, trình xử lý thư giãn ngoại lệ không thể truyền qua mã nhận biết không phải dw2, điều này có nghĩa là bất kỳ ngoại lệ nào đi qua bất kỳ mã "khung ngoại lai" không nhận biết nào sẽ không thành công, bao gồm cả DLL hệ thống và DLL được xây dựng với Visual Studio. Mã gỡ rối của Dwarf-2 trong gcc kiểm tra tổ hợp tháo gỡ x86 và không thể tiến hành nếu không có thông tin thư giãn lùn-2 khác.

Các SetJump LongJump phương pháp công trình xử lý ngoại lệ đối với hầu hết các trường hợp trên cả win32 và win64, trừ lỗi bảo vệ tổng quát. Hỗ trợ xử lý ngoại lệ có cấu trúc trong gcc đang được phát triển để khắc phục các điểm yếu của dw2 và sjlj. Trên win64, thông tin thư giãn được đặt trong phần xdata và có .pdata (bảng mô tả chức năng) thay vì ngăn xếp. Đối với win32, chuỗi trình xử lý nằm trên ngăn xếp và cần được lưu / khôi phục bằng mã thực thi thực.

GCC GNU về Xử lý ngoại lệ :

GCC hỗ trợ hai phương thức xử lý ngoại lệ (EH):

  • DWARF-2 (DW2) EH , yêu cầu sử dụng thông tin gỡ lỗi DWARF-2 (hoặc DWARF-3). DW-2 EH có thể khiến các tệp thực thi bị cồng kềnh vì các bảng hủy kết nối ngăn xếp cuộc gọi lớn phải được đưa vào các tệp thực thi thứ.
  • Một phương pháp dựa trên setjmp / longjmp (SJLJ) . EH dựa trên SJLJ chậm hơn nhiều so với DW2 EH (xử phạt ngay cả thực thi bình thường khi không có ngoại lệ nào được ném), nhưng có thể hoạt động trên mã chưa được biên dịch với GCC hoặc không có thông tin hủy kết nối cuộc gọi.

[...]

Xử lý ngoại lệ có cấu trúc (SEH)

Windows sử dụng cơ chế xử lý ngoại lệ của riêng mình được gọi là Xử lý ngoại lệ có cấu trúc (SEH). [...] Thật không may, GCC chưa hỗ trợ SEH. [...]

Xem thêm:


7
Cảm ơn các liên kết. Tôi sẽ sử dụng DW2 cho 32 bit và SEH cho 64. SEH có sẵn trong mingwbuilds (4.8). Tôi có nên chờ phát hành ổn định 4,8 hay không? Nó biên dịch ở đây. Tôi hiện đang phụ thuộc vào dự án của mình bằng cách sử dụng 4.8 với SEH. Không có vấn đề nào ...
sorush-r

2
Tất cả các phụ thuộc (bao gồm thư viện Boost, OpenSSL, ICU, freeGLUT) được biên dịch nhưng Qt kết thúc với rất nhiều lỗi biên dịch nội bộ. Tôi nghĩ rằng tôi sẽ chờ phiên bản ổn định 4,8
sorush-r

Bạn đã sử dụng nhị phân của qt hay bạn tự biên dịch?

4
@woreos Mình dùng bản dựng Qt của riêng mình. Tôi thấy rằng không có vấn đề gì với cả Qt và GCC 4.8. Đó là RAM bị đốt cháy một nửa của tôi! 1 Bây giờ mọi thứ đều hoạt động tốt
sorush-r

82

SJLJ (setjmp / longjmp): - có sẵn cho 32 bit và 64 bit - không phải là chi phí không giới hạn: ngay cả khi một ngoại lệ không bị ném, nó phải chịu một hình phạt hiệu suất nhỏ (~ 15% trong mã nặng ngoại lệ) - cho phép ngoại lệ để duyệt qua các cửa sổ gọi lại

DWARF (DW2, lùn-2) - chỉ khả dụng trong 32 bit - không có phí thời gian chạy vĩnh viễn - cần toàn bộ ngăn xếp cuộc gọi để được kích hoạt lùn, điều đó có nghĩa là các ngoại lệ không thể được ném qua, ví dụ DLL hệ thống Windows.

SEH (ngoại lệ không chi phí) - sẽ có sẵn cho GCC 4.8 bit.

nguồn: http://qt-project.org/wiki/MinGW-64-bit


2
Xin lỗi, liên kết nguồn được thêm vào.

2
Cảm ơn câu trả lời của bạn;)
sorush-r

14
Vì vậy, bây giờ trong năm 2016 chúng ta có thể đặt câu hỏi này để nghỉ ngơi và chỉ cần luôn luôn sử dụng SEH.
rustyx

6
@RustyX Chỉ khi mục tiêu của bạn là x86_64
sohnryang

Vậy lùn cho x86?
banguru
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.