2009-03-17 42 views
11

Tôi thấy cờ này rất nhiều trong makefiles. Nó có nghĩa là gì và khi nào nó nên được sử dụng?Ý nghĩa của gcc -O2

+0

@cdonner: Ông được downvoted vì anh ta đặt câu hỏi từ các trang MAN của gcc. Có lẽ có mục đích? –

+1

Anh chàng này đang hỏi quá nhiều câu hỏi, anh ta có thể nhận được câu trả lời cho chính mình rất dễ dàng. Mỗi google tài liệu cho GCC? –

+0

Hoàn toàn đồng ý với Brian. Mọi người nên thử người và google trước khi đăng câu hỏi như vậy. – qrdl

Trả lời

33

Tối ưu hóa mức độ 2.

Từ trang GCC người đàn ông:

-O1 Optimize. Việc tối ưu hóa quá trình biên dịch tốn nhiều thời gian hơn và nhiều bộ nhớ hơn cho một chức năng lớn hơn .

-O2 Tối ưu hóa nhiều hơn. GCC thực hiện gần như tất cả các tối ưu hóa được hỗ trợ không liên quan đến tốc độ không gian cân bằng. Trình biên dịch không thực hiện bỏ vòng lặp hoặc chức năng nội tuyến khi bạn chỉ định -O2. Khi so với -O, tùy chọn này tăng cả thời gian biên dịch và hiệu suất của mã được tạo.

-O3 Tối ưu hóa hơn nữa. -O3 bật tất cả các tối ưu hóa được chỉ định bởi -O2 và cũng bật các chức năng -finline, -funswitch-loop, -fprictictive-commoning, -fgcse-after-reload và -ftree-vectorize.

-O0 Giảm thời gian biên soạn và thực hiện gỡ lỗi tạo ra kết quả mong đợi . Đây là mặc định.

-Os Tối ưu hóa kích thước. -Os cho phép tối ưu hóa tất cả -O2 mà không thường tăng kích thước mã. Nó cũng thực hiện tối ưu hóa thêm được thiết kế để giảm kích thước mã.

3

Đây là công tắc tối ưu hóa. Xem gcc --help.

12

Tối ưu hóa mức độ 2, tối đa là 3. Xem: http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

Lưu ý, rằng trong vài năm trước đây -O3 có thể gây ra một số trục trặc do quá "tối ưu hóa" mã. AFAIK, điều đó không còn đúng với các phiên bản GCC hiện đại nữa. Nhưng với quán tính, -O2 được coi là "an toàn tối đa".

1

Trình biên dịch có thể sử dụng các kỹ thuật tối ưu hóa khác nhau như bỏ vòng lặp, tối ưu hóa đường ống CPU để tìm mã vô dụng và tránh các nguy cơ dữ liệu để tăng tốc mã của bạn. Ví dụ, một vòng lặp xảy ra một số lần cố định sẽ được chuyển thành mã tiếp giáp mà không có chi phí điều khiển vòng lặp. Hoặc nếu tất cả các vòng lặp lặp lại là độc lập, một số mã song song là có thể.

Đặt mức tối ưu hóa thành 2 cho biết bao nhiêu năng lượng mà trình biên dịch nên dành để tìm kiếm các tối ưu hóa đó. Các giá trị có thể nằm trong khoảng 1-3

Bạn có thể tìm hiểu thêm về những gì các trình biên dịch có thể làm để tối ưu hóa mã của bạn: http://en.wikipedia.org/wiki/Compiler_optimization

2

Cố gắng manpage?

-O2

Tối ưu hóa nhiều hơn. GCC thực hiện gần như tất cả các tối ưu hóa được hỗ trợ không liên quan đến sự cân bằng tốc độ không gian. Trình biên dịch không thực hiện việc bỏ vòng lặp hoặc chức năng nội tuyến khi bạn chỉ định -O2.So với -O, tùy chọn này tăng cả thời gian biên dịch và hiệu suất của mã được tạo.

Nói cách con người: đó là cách tối ưu hóa an toàn thực sự cao nhất. -O3 làm cho việc tổ chức lại có thể gây rắc rối ở lần. Chủ đề như vậy là khá sâu.

1

Nếu không có bất kỳ tùy chọn tối ưu hóa nào, mục tiêu của trình biên dịch là giảm chi phí biên dịch và thực hiện gỡ lỗi tạo ra kết quả mong đợi. Bật tối ưu hóa làm cho trình biên dịch cố gắng cải thiện hiệu suất và/hoặc kích thước mã tại chi phí của thời gian biên dịch và có thể khả năng gỡ lỗi chương trình.

Giá trị mặc định là tắt tối ưu hóa. Điều này dẫn đến thời gian biên dịch nhanh nhất, nhưng trình biên dịch hoàn toàn không cố gắng tối ưu hóa, và các chương trình được tạo ra là lớn hơn đáng kể và chậm hơn khi tối ưu hóa được kích hoạt. Có nhiều thiết bị chuyển mạch -O khác nhau (các biểu mẫu được phép là -O0, -O1 -O2, -O3 và -Os) trong gcc để kiểm soát mức tối ưu hóa:

-O0 Không tối ưu hóa; tạo mã không được tối ưu hóa nhưng có thời gian biên dịch nhanh nhất. Đây là mặc định.

-O1 Tối ưu hóa trung bình; tối ưu hóa khá tốt nhưng không làm giảm đáng kể thời gian biên dịch. Phải mất nhiều bộ nhớ hơn cho chức năng lớn.

-O2 GCC thực hiện gần như tất cả các tối ưu hóa được hỗ trợ không liên quan đến sự cân bằng tốc độ không gian. Trình biên dịch không thực hiện việc bỏ vòng lặp hoặc chức năng nội tuyến khi bạn chỉ định

-O3 Tối ưu hóa đầy đủ như trong -O2; cũng sử dụng nội tuyến tự động tích cực hơn của các chương trình con trong một đơn vị và cố gắng để vector hóa các vòng lặp. Nó cũng bật các chức năng -finline -funswitch-loop, -fpredictive-commoning, -fgcse-after-reload và -ftree-vectorize.

-Os Tối ưu hóa kích thước. -Os cho phép tối ưu hóa tất cả -O2 mà không thường tăng kích thước mã. Nó cũng thực hiện tối ưu hóa hơn nữa được thiết kế để giảm kích thước mã.

Để tìm hiểu thêm về cờ/tùy chọn sử dụng ở mức độ tối ưu hóa khác nhau và chi tiết của họ: http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html