2010-09-19 41 views
12

Tôi đã đọc rất nhiều về ngoại lệ C++ và những gì tôi thấy, đặc biệt là ngoại lệ hiệu suất là một chủ đề khó. Tôi thậm chí đã cố gắng để xem xét dưới mui xe của g ++ để xem làm thế nào trường hợp ngoại lệ được đại diện trong lắp ráp.Hiệu suất khi ngoại lệ không được ném (C++)

Tôi là lập trình viên C, vì tôi thích các ngôn ngữ cấp thấp hơn. Một số thời gian trước, tôi quyết định sử dụng C + + trên C vì với chi phí nhỏ nó có thể làm cho cuộc sống của tôi dễ dàng hơn nhiều (các lớp trên cấu trúc, các mẫu, vv).

Trở lại câu hỏi của tôi, như tôi thấy trường hợp ngoại lệ làm tạo overhead nụ chỉ khi chúng xảy ra , bởi vì nó đòi hỏi một chuỗi dài của những bước nhảy và hướng dẫn so sánh để tìm một xử lý ngoại lệ thích hợp. Trong thực thi chương trình bình thường (không có lỗi), các chi phí ngoại lệ bằng với việc kiểm tra mã trả về bình thường. Tôi có đúng không?

+0

* Cảm ơn * cho hậu tố "một lần nữa" trong tiêu đề. – delnan

+1

Tôi nghĩ câu trả lời là trình biên dịch cụ thể –

+3

Nếu bạn đang băn khoăn về tác động của hiệu suất, ** hãy đo lường nó **. –

Trả lời

12

Vui lòng xem câu trả lời chi tiết của tôi cho một câu hỏi tương tự here.

Chi phí xử lý ngoại lệ là nền tảng cụ thể và phụ thuộc vào hệ điều hành, trình biên dịch và kiến ​​trúc CPU mà bạn đang chạy.

Đối với Visual Studio, Windows và x86, có chi phí ngay cả khi ngoại lệ không được ném. Trình biên dịch tạo ra mã bổ sung để theo dõi "phạm vi" hiện tại mà sau này được sử dụng để xác định những gì destructors để gọi và nơi để bắt đầu tìm kiếm các bộ lọc ngoại lệ và xử lý. Thay đổi phạm vi được kích hoạt bởi các khối try và tạo các đối tượng có destructors.

Đối với Visual Studio, Windows và x86-64, chi phí về bản chất là không khi ngoại lệ không được ném. Các x86-64 ABI có giao thức chặt chẽ hơn xung quanh xử lý ngoại lệ hơn x86, và hệ điều hành làm rất nhiều nâng nặng, do đó chương trình tự nó không cần phải theo dõi nhiều thông tin để xử lý các ngoại lệ.

Khi trường hợp ngoại lệ xảy ra, chi phí là đáng kể, đó là lý do tại sao chúng chỉ xảy ra trong các trường hợp thật sự ngoại lệ. Xử lý các ngoại lệ trên x86-64 đắt hơn x86, vì kiến ​​trúc được tối ưu hóa cho trường hợp ngoại lệ phổ biến hơn không xảy ra.

+0

Tôi biết nó đã được 3 năm, nhưng có rất ít chi phí trên Linux x86-64 là tốt? – contrapsych

+1

@ JAKE6459 Tôi không thể trả lời dứt khoát, nhưng một trong những lợi ích của x86-64 trên x86 là cách thức mà các ngoại lệ được hỗ trợ, và tôi chắc chắn Linux tận dụng điều này. Như mọi khi, nếu bạn thực sự cần biết, hãy lập hồ sơ cho mã của bạn. Nếu bạn đang sử dụng C/C++ trên Linux, hãy nhìn vào 'gprof'. –

+0

Bạn có thể thành thật nói rằng mã được biên dịch với các ngoại lệ bị tắt không thể đo được nhanh hơn? –

4

Dưới đây là một bài đánh giá chi tiết về chi phí của việc xử lý ngoại lệ khi không có ngoại lệ đang thực sự ném:

http://www.nwcpp.org/old/Meetings/2006/10.html

Nói chung, trong mọi chức năng sử dụng xử lý ngoại lệ (có hoặc try/catch khối hoặc tự động đối tượng với destructor) - trình biên dịch tạo ra một số mã prolog/epilog bổ sung để xử lý hồ sơ đăng ký expcetion.

Cộng sau khi mọi đối tượng tự động được xây dựng và hủy - thêm một vài lệnh lắp ráp được thêm vào (điều chỉnh hồ sơ đăng ký ngoại lệ).

Ngoài ra, một số tối ưu hóa có thể bị tắt. Đặc biệt đây là trường hợp khi bạn làm việc trong cái gọi là mô hình xử lý ngoại lệ "không đồng bộ".

+2

FYI, liên kết được cung cấp hiện đang treo lơ lửng. : -/ –

Các vấn đề liên quan