2012-01-23 58 views
13

Nếu tôi muốn đạt được hiệu suất tốt hơn, ví dụ, MySQLdb, tôi có thể biên dịch nó và tôi sẽ có hiệu năng tốt hơn vì nó không được biên dịch trên i386, i486 hoặc những gì trên CPU của tôi. Hơn nữa tôi có thể chọn các tùy chọn biên dịch và như vậy ... Bây giờ, tôi đã tự hỏi điều này cũng đúng đối với phần mềm không thường xuyên, chẳng hạn như trình biên dịch. Đây là phần đầu tiên:Hiệu suất biên dịch mã bằng biên dịch biên dịch

  • Sẽ biên dịch trình biên dịch như GCC mang lại hiệu suất tốt hơn? và phần thứ hai:
  • Mã được biên dịch bởi trình biên dịch được biên dịch của riêng tôi có hoạt động tốt hơn không?

(Vâng, tôi biết, tôi có thể biên dịch biên dịch và benchmark nó của tôi ... nhưng có lẽ ... ai đó đã biết câu trả lời, và sẽ chia sẻ nó với chúng tôi =)

+0

_ Kính bảo hộ! Họ không làm gì cả! _;) – Izkata

+0

Vâng, tôi đã hỏi họ, nhưng họ bận rộn trên bức tường trèo :-P – Oz123

+5

Yo dawg, tôi nghe bạn như những người biên dịch. – joshin4colours

Trả lời

14

Trong câu trả lời cho bạn câu hỏi đầu tiên, gần như chắc chắn có. Phiên bản nhị phân của gcc sẽ là "mẫu số chung thấp nhất" và, nếu bạn biên dịch chúng với các cờ đặc biệt phù hợp hơn với hệ thống của bạn, nó sẽ rất có thể nhanh hơn.

Đối với câu hỏi thứ hai của bạn, không.

Đầu ra của trình biên dịch sẽ giống nhau bất kể bạn đã tối ưu hóa nó như thế nào (trừ khi đó là lỗi, tất nhiên).

Nói cách khác, ngay cả khi bạn hoàn toàn nhồi cờ biên dịch của mình khi biên dịch gcc, đến thời điểm phiên bản được biên dịch cụ thể của bạn gcc mất một tuần rưỡi để biên dịch "Hello World", "Hello World" thực tế thực thi phải giống hệt với mẫu được tạo bởi "mẫu số chung thấp nhất" gcc (nếu bạn sử dụng cùng một cờ).

+4

Về phần thứ hai: nó thậm chí còn phổ biến cho việc khởi động trình biên dịch được thực hiện theo 3 bước: 1. biên dịch trình biên dịch bằng trình biên dịch hiện có (có thể tối thiểu, không tối ưu hóa), 2.) biên dịch trình biên dịch bằng cách sử dụng nhị phân được tạo ra ở bướC# 1. (tức là biên dịch nó với chính nó) và 3.) biên dịch trình biên dịch với trình biên dịch được tạo ra ở bướC# 2. Các tệp nhị phân được tạo trong các bướC# 2 và # 3 phải hoàn toàn giống nhau (ngoại trừ một số dấu thời gian được nhúng hoặc các thứ tương tự) và thực tế đó được sử dụng để kiểm tra xem trình biên dịch có biên dịch chính xác hay không. –

+0

wow, cảm ơn tất cả những người trả lời. Tôi nghĩ rằng tôi sẽ bị bashed cho một câu hỏi "tầm thường" như vậy. Nhưng ngược lại ... – Oz123

3

a.Vâng, bạn có thể biên dịch trình biên dịch sang hệ thống của mình và có thể nó sẽ chạy nhanh hơn. giống như bất kỳ chương trình nào. (Tôi nghĩ rằng bình thường nó không phải là giá trị nó, nhưng làm bất cứ điều gì bạn muốn).

b. Thậm chí nếu bạn biên dịch trình biên dịch trong máy tính của bạn, hành vi của nó không nên thay đổi, và vì vậy mã mà nó tạo ra cũng không thay đổi.

5

(1) Có thể. Nếu bạn giới thiệu một tối ưu hóa mới cho trình biên dịch của bạn, và biên dịch lại nó với sự tối ưu hóa này - có thể là mã được biên dịch lại sẽ hoạt động tốt hơn.

(2) Không !!!! Trình biên dịch không thể thay đổi logic của mã! Trong trường hợp của bạn, logic của mã là mã gốc được tạo ra ở cuối. Vì vậy, nếu trình biên dịch A_1 được biên dịch bằng trình biên dịch A_2 hoặc B, không ảnh hưởng đến mã gốc được tạo bởi A_1 [ở đây A_1, A_2 là các trình biên dịch tương tự, chỉ mục chỉ để rõ ràng].

+3

+1 cho dòng in đậm. Trong thực tế biên dịch một trình biên dịch không có nghĩa là bạn đã thêm các kỹ thuật tối ưu hóa của riêng bạn mà là nhanh hơn. –

+1

@Shiplu: tất nhiên giả sử bạn đã tuân thủ các quy tắc và không làm bất cứ điều gì ngớ ngẩn như hành vi không xác định :-) Sau đó, một trình biên dịch miễn phí phát ra mã khác nhau cho dù ngay cả khi _nothing_ đã thay đổi. – paxdiablo

+0

-1 cho dòng in đậm. Oz123 yêu cầu không được đánh giá quá gay gắt nhưng rõ ràng là bạn không đọc câu hỏi. – Codo

2

Việc biên dịch trình biên dịch như GCC có mang lại hiệu suất tốt hơn không?

Chương trình được biên dịch riêng cho nền tảng đích được sử dụng thường sẽ hoạt động tốt hơn chương trình được biên dịch cho nền tảng chung. Tại sao điều này? Kiến thức về harware có thể giúp trình biên dịch sắp xếp dữ liệu thành bộ nhớ cache thân thiện và chọn thứ tự lệnh phù hợp với pipelining của CPU.

Lợi ích lớn nhất là đạt được bằng cách tận dụng các tập lệnh cụ thể như SSE (trong các phiên bản khác nhau của nó). Mặt khác, bạn nên tự hỏi mình nếu một programm như GCC thực sự là CPU bị ràng buộc (nhiều khả năng nó sẽ được IO bị ràng buộc) và điều chỉnh hiệu suất CPU của nó cung cấp bất kỳ lợi ích đo lường được.

mã biên dịch bởi trình biên dịch biên soạn riêng tôi sẽ thực hiện tốt hơn

Hy vọng rằng không! Việc cho phép trình biên dịch tối ưu hóa một chương trình sẽ không bao giờ thay đổi hành vi của nó. Không có vấn đề làm thế nào bạn biên dịch GCC của bạn, nó nên biên dịch mã để các mã nhị phân giống như một phân phối nhị phân chung của GCC sẽ.

Nếu mã được biên dịch cho nền tảng cụ thể nhanh hơn mã compil cho nền tảng chung, tại sao chúng ta không gửi mã thay vì mã nhị phân? Đoán xem cái gì, một số bản phân phối Linux thực sự tuân theo phillosophy này, như Gentoo. Và trong khi bạn đang ở đó, hãy chắc chắn để xây dựng nhị phân liên kết tĩnh, không gian đĩa là rất rẻ ngày nay và nó mang lại cho bạn ít nhất một 0,001% hiệu suất.

Được rồi, đó là một chút mỉa mai. Lý do mọi người phân phối các tệp nhị phân chung là khá rõ ràng: Đó là genirc, mẫu số chung thấp nhất và nó sẽ hoạt động ở mọi nơi. Đó là một phần thưởng lớn về tính linh hoạt và thân thiện với người dùng. Tôi nhớ một khi biên dịch Gnome cho hộp Gentoo của tôi, mất một hoặc hai ngày! (Nhưng nó phải nhanh hơn rất nhiều ;-))

Mặt khác, có những dịp bạn muốn có hiệu suất tốt nhất có thể và có ý nghĩa khi xây dựng và tối ưu hóa cho các kiến ​​trúc cụ thể.

0

GCC sử dụng bootstraping ba bước khi xây dựng từ nguồn. Về cơ bản nó biên dịch mã nguồn ba lần để đảm bảo các công cụ xây dựng và trình biên dịch được xây dựng thành công. Bootstraping này được sử dụng cho mục đích xác nhận. Tuy nhiên, có thể sử dụng giai đoạn 1 làm điểm chuẩn để tối ưu hóa các giai đoạn sau. Bạn nên xây dựng GCC với make profiledbootstrap để sử dụng tối ưu hóa dựa trên cấu hình này.

Quy trình xây dựng dựa trên hồ sơ này làm tăng hiệu suất của "GCC", chứ không phải phần mềm được biên dịch với nó, như các câu trả lời khác chỉ ra.