2012-11-09 30 views
14

Tôi có một dự án lớn, khoảng 150 000 LOC của mã C++. Thời gian xây dựng là khoảng 15 phút. Dự án này bao gồm nhiều tiểu dự án có quy mô khác nhau.Thời gian xây dựng GCC không được hưởng lợi nhiều từ các tiêu đề được biên dịch trước

Tôi đã xây dựng các tiêu đề được biên dịch riêng biệt cho mỗi tiểu dự án, nhưng khi tôi sử dụng chúng, thời gian xây dựng vẫn gần bằng nhau. Dường như thời gian xây dựng ít hơn 5-10%, không nhiều hơn.

Đầu đề biên dịch chắc chắn được sử dụng, tôi sử dụng tùy chọn -Winvalid-pch và tôi đã cố biên dịch với tùy chọn biên dịch -H, tiêu đề được biên dịch trước của tôi xuất hiện ở đầu ra có ký hiệu 'bang', nghĩa là trình biên dịch có thể sử dụng tiêu đề được biên dịch trước.

Tất cả các tiêu đề được biên dịch trước của tôi không phải là rất lớn, mỗi tệp là khoảng 50Mb. Tôi sử dụng tập lệnh python, được tìm thấy here để tạo danh sách các tiêu đề được biên dịch sẵn nhất nên danh sách các ứng viên biên dịch trước của tôi khá tốt.

Có công cụ miễn phí/mã nguồn mở nào để tối ưu hóa xây dựng không? Dường như tiện ích tiêu chuẩn make không có khả năng đo lường thời gian xây dựng của các mục tiêu khác nhau. Tôi không thể tìm cách để có được số liệu thống kê cho các mục tiêu khác nhau với make. Tôi không nói về phân tích phụ thuộc hay cái gì đó tiên tiến. Tôi chỉ muốn biết những mục tiêu nào phần lớn thời gian đã bị lãng phí.

Ngoài ra, có vẻ như GCC không hiệu quả trong việc xử lý các tiêu đề được biên dịch trước. Tôi đã không thể nhận được bất kỳ tiểu dự án xây dựng đáng kể nhanh hơn, tối đa tốc độ mà tôi nhận được là 20% trên một dự án mà được ba phút để xây dựng. Dường như nó dễ dàng hơn và rẻ hơn để mua máy nhanh hơn với ổ đĩa trạng thái rắn hơn là tối ưu hóa thời gian xây dựng trên Linux với GCC.

+1

thử xây dựng với cả mã nguồn và thư mục đầu ra nằm trong/dev/shm. Nếu thời gian xây dựng giảm đáng kể thì hệ thống tệp xây dựng trước của bạn là người đóng góp thời gian xây dựng chính. – bobah

+4

Tôi sẽ không gọi nó là rất lớn.Giống như một dự án giữa kích thước vừa và nhỏ :) –

+0

@ BЈовић đồng ý, nhưng tăng cường biên dịch nhanh hơn (hoặc ít nhất là so sánh) trên máy của tôi. – Lazin

Trả lời

6

Nếu bạn muốn tận dụng tối đa tính năng này, bạn cần phải hiểu cách các dự án của bạn có thể được cấu trúc để sử dụng tốt chúng. Cách tốt nhất là quy trình chậm, cứng của việc giảm thời gian xây dựng theo cách thủ công. Nghe có vẻ ngu ngốc lúc đầu, nhưng nếu tất cả các bản xây dựng đi về phía trước đều nhanh hơn gấp 5 lần và bạn biết cách cấu trúc các dự án và các phụ thuộc của bạn tiến lên phía trước - thì bạn nhận ra phần thưởng.

Bạn có thể thiết lập một hệ thống tích hợp liên tục với mục tiêu của bạn để đo và ghi lại tiến bộ của bạn/cải tiến như những thay đổi của bạn thành hiện tại.

tôi có một dự án khổng lồ, một cái gì đó khoảng 150 000 LỘC của C++. Thời gian xây dựng là khoảng 15 phút. Dự án này bao gồm nhiều tiểu dự án có quy mô khác nhau.

Có vẻ như bạn đang làm rất nhiều công việc thừa, giả sử bạn có máy hiện đại.

Đồng thời xem xét thời gian liên kết.

Tất cả các tiêu đề được biên dịch trước của tôi không quá lớn, mỗi tệp là khoảng 50Mb.

Đó là khá lớn, IMO.

Tôi không nói về phân tích phụ thuộc hoặc điều gì đó nâng cao.

Một lần nữa, tích hợp liên tục cho số liệu thống kê.Đối với một xây dựng mà chậm, phụ thuộc quá nhiều là rất có khả năng vấn đề (trừ khi bạn có nhiều tập tin cpp nhỏ, hoặc một cái gì đó ngớ ngẩn như kiệt sức bộ nhớ vật lý đang xảy ra).

tôi đã không thể nhận được bất kỳ tiểu dự án xây dựng đặc biệt là nhanh hơn, tăng tốc tối đa mà tôi nhận được là 20%

Hiểu cấu trúc và sự phụ thuộc của bạn. PCH làm chậm hầu hết các dự án của tôi.

Dường như việc mua máy nhanh hơn với ổ trạng thái rắn dễ dàng và rẻ hơn để tối ưu hóa thời gian xây dựng trên Linux với GCC.

Rất có thể, máy đó sẽ không làm cho xây dựng lần 20x nhanh hơn, nhưng bạn sửa chữa lên phụ thuộc của bạn và cơ cấu dự án có thể làm cho nó nhanh hơn 20x (hoặc bất kỳ thư mục gốc của vấn đề cuối cùng là). Máy giúp chỉ rất nhiều (xem xét thời gian xây dựng cho 150KSLOC).

Bản dựng của bạn có thể là CPU/bộ nhớ bị ràng buộc.

+0

Dường như tôi có nhiều tệp cpp nhỏ: '% find. tên "* .cpp" | grep. -c' trả về 846. Ngoài ra, dự án này chủ yếu bao gồm hai thư viện tĩnh lớn, các dự án khác tương đối nhỏ, bất kỳ dự án nào nhỏ hơn bất kỳ thư viện tĩnh lớn nào. Một trong những thư viện tĩnh này có kích thước 700Mb. Và code-base là định hướng tăng cường, nó sử dụng boost.spirit rất nhiều, ví dụ. – Lazin

+0

@Lazin hmm ... khoảng 1 tệp mỗi giây có thể không quá tệ đối với kích thước và phần cứng của dự án của bạn. clang xây dựng nhanh hơn gcc trên hệ thống của tôi - hãy thử. phân tích phụ thuộc và giảm, http://code.google.com/p/include-what-you-use/, có lẽ sự hợp nhất được xây dựng. một khi các phụ thuộc được giảm xuống, thì bạn có thể giảm những PCH bao gồm. cũng xác định xem bạn có thể tái sử dụng PCH không. tất cả các tệp cpp đó sẽ đẩy lên kích thước tệp đối tượng và thời gian liên kết. trong trường hợp đó, bạn có thể có rất nhiều I/O khi xây dựng. tất nhiên, tất cả những tệp nhỏ đó cũng có khả năng sẽ đẩy mạnh quá trình biên dịch thừa. – justin

+1

clang không biên dịch dự án của chúng tôi vì BOOST_STATIC_ASSERT và vài thứ khác. Tôi sẽ thử công cụ này sau, có vẻ như nó sẽ rất hữu ích. Cảm ơn! – Lazin

10

GCC xây dựng thời gian không được hưởng lợi nhiều từ tiêu đề precompiled

Vâng, không may đó là thường đúng,

Có một số dự án thí điểm để làm điều gì đó tốt hơn, xem http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3426.htmlhttp://gcc.gnu.org/wiki/pph, nhưng chúng không thể sử dụng được.

Tôi đồng ý với câu trả lời khác rằng 15 phút cho 150KLOC là khá chậm.

Tôi nhận thấy rằng việc sử dụng trình liên kết Gold tạo sự khác biệt lớn về thời gian xây dựng, tôi thực sự khuyên bạn nên sử dụng nó.

Bạn cũng có thể xem xét ccache mà có thể giúp đỡ, và nếu bạn có chu kỳ phụ tùng trên các máy khác distcc

xây dựng Tránh trên đĩa chậm, chắc chắn tránh đĩa mạng. Tránh các lời gọi đệ quy thực hiện, dành nhiều thời gian hơn đọc các tệp makefiles và tạo lại các đồ thị phụ thuộc. Nếu bạn có thể cấu trúc các makefiles tiểu dự án của bạn để tất cả chúng có thể được bao gồm bởi một makefile cấp cao nhất, việc thực hiện không đệ quy sẽ mất nhiều thời gian hơn để bắt đầu nhưng sẽ bay khi nó bắt đầu xây dựng các mục tiêu. Điều đó có thể được rất nhiều công việc để viết lại makefiles mặc dù.

Và có thể không nói, nhưng xây dựng trên máy đa lõi và sử dụng make -j N trong đó quy tắc chung là N phải gấp đôi số lõi, hoặc nhiều hơn nếu biên dịch là I/O bị ràng buộc.

+2

Tôi đã thử ccache, biên dịch lại rất nhanh ngay bây giờ. Tôi sẽ cố gắng liên kết vàng tomorow, nhờ lời khuyên. – Lazin

0

Tôi sử dụng - bao gồm khi tạo và sử dụng PCH để bao gồm tệp có nhiều tiêu đề. Nó giúp, nhưng nó vẫn không ấn tượng.

Đếm số phước lành của bạn, mặc dù: gcc có vẻ nhanh gấp nhiều lần so với MSVC, mặc dù MSVC có hỗ trợ PCH tốt hơn.

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