2013-03-14 38 views
12

Làm cách nào để tìm ra nơi trình biên dịch dành thời gian của nó?Làm thế nào để tìm ra nơi trình biên dịch dành thời gian của nó?

Quá trình xây dựng của tôi quá chậm, tôi đã sử dụng RAMdisk cho các tệp tạm thời VC++ và nó không tạo ra bất kỳ sự khác biệt nào. (Tôi có một ổ SSD, vì vậy tôi mong đợi không có sự khác biệt.)

Hầu hết các tệp C++ đơn lẻ trong dự án này mất khoảng. 2 giây để biên dịch mà có vẻ khủng khiếp (như tôi cũng không có bất kỳ song song trong dự án vì tôi đang sử dụng VS2005).

Làm cách nào để tối ưu hóa điều này? Không tối ưu hóa mà không có hồ sơ, nhưng làm thế nào để tôi hồ sơ trình biên dịch?

Lưu ý: Đây không phải là thực sự hữu ích:

  • Profiling the C++ compilation process
  • Displaying build times in Visual Studio? (Nó không phải là hoàn toàn không có công đức dù ... nếu bạn làm một bộ sưu tập đơn tập tin, thay vì toàn bộ dự án, nó sẽ hiển thị thời gian thực hiện cho một tập tin duy nhất: Bằng cách đó tôi thấy rằng khá một số tác phẩm ở đây mất hơn 5 giây, một số thậm chí 10 giây khi biên soạn độc lập)

Hãy thêm nhận xét hay: Bạn có nhiều mẫu không? Các tệp của bạn ở mức trung bình bao nhiêu? Bạn đã chọn chỉ bao gồm tối thiểu các tiêu đề cần thiết

Không, tôi không làm như vậy. Tôi có thể (và pro'lly sẽ) tất nhiên. Tôi có thể tìm thấy điều gì đó, nhưng tất cả đều là đầu cơdùng thử và lỗi!

"Mọi người" cho bạn biết rằng bạn chỉ nên tối ưu hóa sau khi đo/lược tả, nhưng khi tối ưu hóa thời gian biên dịch, chúng tôi sẽ quay lại dùng thử lỗi &?


Lưu ý: Các đề xuất "hack" từ những ý kiến ​​với __TIME__ không không làm việc, ít nhất là không trên Visual C++, vì (như the docs nhà nước): Các gần đây nhất thời gian biên dịch của tệp nguồn hiện tại. Thời gian là một chuỗi chữ có dạng hh: mm: ss. - Tôi đoán ít nhất có thể có được thời gian cho các đơn vị biên dịch đơn với con tem này, nhưng nó không giúp đi sâu vào một đơn vị biên dịch.

+0

Bạn có nhiều mẫu không? Các tệp của bạn ở mức trung bình bao nhiêu? Bạn có kiểm tra chỉ bao gồm tối thiểu các tiêu đề cần thiết không? – stefan

+0

bạn có đang sử dụng các tiêu đề được biên dịch trước không? –

+0

@MartinBa Với "chỉ bao gồm tối thiểu cần thiết của tiêu đề", nó không phải là cố gắng và lỗi, đó là thực hành tốt. Về kích thước tệp trung bình: Trình biên dịch cần phải phân tích cú pháp toàn bộ nội dung, vì vậy rõ ràng là có giới hạn về hiệu ứng được cung cấp bởi kích thước tệp. Tôi muốn đề xuất một hệ thống xây dựng gia tăng trong đó chỉ thay đổi các tập tin được biên dịch lại. Sau đó, bạn thực sự không phải lo lắng về thời gian biên dịch dài. – stefan

Trả lời

2

SysInternals ProcMon sẽ cho bạn thấy tất cả các I/O được thực hiện bởi các quy trình được chọn, bao gồm dấu thời gian khi nó xảy ra và đường dẫn đầy đủ.

+0

Hmmm ... có vẻ khó khăn để thực hiện việc này với VC++ ... Tôi có 'devenv. exe', nhưng điều này sẽ đẻ trứng 'cl.exe' (thông qua một số trung gian tôi nghĩ). Bạn đã bao giờ thử điều này trên một VS build chưa? –

+0

Process Monitor có các bộ lọc rất linh hoạt. Bạn có thể đặt bộ lọc phù hợp với quy trình thực thi. Bạn không cần sử dụng PID của tiến trình đang chạy. – Weeble

2

Có một vài cách để tối ưu hóa thời gian biên dịch của bạn:

  • Sử dụng một tiêu đề biên dịch sẵn. Nếu bạn sử dụng Visual C++ hơn là sử dụng "stdafx.h". Theo mặc định "stdafx.h" được đặt làm tiêu đề được biên dịch sẵn nhưng tôi khuyên bạn nên kiểm tra để đảm bảo nó là đúng.

  • Sử dụng Linux :). Nếu bạn không phải sử dụng Windows cho những gì bạn đang làm, tôi khuyên bạn nên sử dụng Linux. Thời gian biên dịch trên đó tốt hơn rất nhiều. Một số lý do là: ext4 nhanh hơn ~ 40% so với NTFS và nó có trình lên lịch quy trình tốt hơn.Khi nói đến các hoạt động của bộ xử lý, Linux thường chạy nhanh hơn x1.8 - x2 lần và biên dịch phụ thuộc vào bộ vi xử lý.

  • Sử dụng Trình biên dịch khác. Clang/LLVM được biết là có tốc độ biên dịch tốt hơn và cũng có hỗ trợ cho các tiêu đề được biên dịch trước.

+0

* Nếu bạn sử dụng Visual C++ hơn là sử dụng "stdafx.h", hãy đặt tất cả các tiêu đề của bạn vào đó. * - lời khuyên xấu. ** tất cả ** tiêu đề chắc chắn là * không * những gì người ta muốn đặt trong 'stdafx.h' (và, vâng, tôi đang sử dụng nó cho các tiêu đề được chọn) –

+0

Đó là khuyến cáo của Microsoft, chứ không phải bởi tôi ... –

+0

MS chắc chắn không khuyến khích điều này. * Tất cả * tiêu đề? vui lòng tham khảo. –

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