2009-04-28 36 views
28

Tôi chỉ mới bắt đầu với trình biên dịch g ++ trên Linux và có một số câu hỏi về cờ biên dịch. Dưới đây là họTối ưu hóa và cờ để tạo một thư viện tĩnh với g ++

tối ưu hóa

Tôi đọc về cờ tối ưu -O1, -O2-O3 trong g ++ trang hướng dẫn. Tôi không hiểu khi nào sử dụng những lá cờ này. Thường thì bạn sử dụng mức tối ưu hóa nào? Hướng dẫn sử dụng g ++ cho biết những điều sau đây cho -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ợ mà không liên quan đến một 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 hàm 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 ra.

Nếu nó không thực hiện nội tuyến và bỏ vòng lặp, cách trang phục hiệu suất được thực hiện và tùy chọn này được khuyến nghị như thế nào?

Thư viện tĩnh

Làm thế nào để tạo ra một thư viện tĩnh nhờ sủ dụng g ++? Trong Visual Studio, tôi có thể chọn một dự án thư viện lớp và nó sẽ được biên dịch thành tệp "lib". Tương đương trong g ++ là gì?

+1

[Năm 2003, GCC's -O3 bị lỗi và có một đoạn rap xấu.] (Http://stackoverflow.com/a/11546263/845092) Ngày nay nó chỉ tạo ra mã xấu khi bạn phá vỡ các quy tắc, nhưng những người như phá vỡ quy tắc và phát điên khi hậu quả xảy ra, vì vậy họ dính vào -O2 để tránh hậu quả của việc viết mã bất hợp pháp. –

Trả lời

2

Có nhiều tối ưu hóa mà trình biên dịch có thể thực hiện, ngoài việc bỏ vòng lặp và nội tuyến. Loop unrolling và nội tuyến được đặc biệt đề cập ở đó kể từ khi, mặc dù họ làm cho mã nhanh hơn, họ cũng làm cho nó lớn hơn.

Để tạo thư viện tĩnh, hãy sử dụng 'g ++ -c' để tạo tệp .o và 'ar' để lưu trữ chúng vào thư viện.

+0

Cảm ơn. "Ar" là gì? Đó có phải là trình chuyển đổi trình biên dịch g ++ hay trình bao không? Nó sẽ là tuyệt vời nếu bạn có thể chỉ cho tôi cách "ar" được sử dụng. –

+0

Không sao cả. Tôi đã kiểm tra "ar" và tìm thấy hướng dẫn cho nó. Rất cám ơn vì điều đó –

4

Về thời điểm sử dụng tùy chọn tối ưu hóa nào - không có câu trả lời đúng nào.

Các mức tối ưu nhất định đôi khi có thể làm giảm hiệu suất. Nó phụ thuộc vào loại mã bạn đang viết và mẫu thực thi nó có và phụ thuộc vào CPU cụ thể mà bạn đang chạy.

(Để đưa ra một ví dụ điển hình đơn giản - trình biên dịch có thể quyết định sử dụng tối ưu hóa làm cho mã của bạn hơi lớn hơn trước đây. Điều này có thể khiến một phần nhất định của mã không còn phù hợp với bộ nhớ cache, tại thời điểm đó nhiều truy cập vào bộ nhớ sẽ được yêu cầu - trong một vòng lặp, ví dụ).

Tốt nhất là nên đo lường và tối ưu hóa cho bất cứ điều gì bạn cần. Hãy thử, đo lường và quyết định.

Một nguyên tắc quan trọng - các tối ưu hóa được thực hiện trên mã của bạn càng khó gỡ lỗi bằng cách sử dụng trình gỡ rối (hoặc đọc tháo gỡ), vì chế độ xem nguồn C/C++ được tách xa . Đó là một nguyên tắc tốt để làm việc với ít tối ưu hóa hơn khi phát triển/gỡ lỗi vì lý do này.

41

Nguyên tắc hàng đầu:

Khi bạn cần phải gỡ lỗi, sử dụng -O0 (. Và -g để tạo ra những biểu tượng gỡ lỗi)

Khi bạn đang chuẩn bị để vận chuyển nó, sử dụng -O2.

Khi bạn sử dụng gentoo, hãy sử dụng -O3 ...!

Khi bạn cần phải đặt nó trên một hệ thống nhúng, sử dụng -os (tối ưu hóa cho kích thước, không cho hiệu quả.)

+6

Tại sao không sử dụng -O3 cho tất cả các nền tảng? Windows không thể xử lý -O3? –

+0

Cảm ơn các quy tắc, Josh. Trang người dùng Linux không bao gồm thứ tự quan trọng này. – theJollySin

+1

Tôi chỉ muốn bảo vệ điều -O3 bằng cách chỉ ra nó có thể gây ra nhiều vấn đề hơn là giải quyết. -O3 liên quan đến việc bỏ vòng lặp theo mặc định và các tối ưu hóa nguy hiểm khác làm cho các giả định về cách mã của bạn được gọi. -O2 là an toàn như một quy tắc của ngón tay cái, nhưng bạn nên có một/lý do/để đi đến -O3. –

5

Các gcc tay danh sách tất cả các tùy chọn ngụ ý của mọi cấp độ tối ưu hóa. Tại O2, bạn nhận được những thứ như liên tục gấp, dự đoán chi nhánh và co, có thể thay đổi đáng kể tốc độ của ứng dụng của bạn, tùy thuộc vào mã của bạn. Các tùy chọn chính xác phụ thuộc phiên bản, nhưng chúng được ghi lại chi tiết.

Để xây dựng một thư viện tĩnh, bạn sử dụng ar như sau:

ar rc libfoo.a foo.o foo2.o .... 
ranlib libfoo.a 

Ranlib không phải lúc nào cũng cần thiết, nhưng không có lý do để không sử dụng nó.

0

Liên quan đến câu hỏi thư viện tĩnh câu trả lời được đưa ra bởi David Cournapeau là chính xác nhưng bạn có thể sử dụng cờ 's' với 'ar' thay vì chạy ranlib trên tệp thư viện tĩnh của bạn. Các 'ar' manual page tiểu bang rằng

Chạy trên lưu trữ tương đương với chạy ranlib trên đó.

Phương pháp nào bạn sử dụng chỉ là vấn đề sở thích cá nhân.

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