2010-04-29 22 views
27

Trên dự án C++ gốc, việc liên kết ngay bây giờ có thể mất một hoặc hai phút. Tuy nhiên, trong thời gian này, CPU giảm từ 100% trong quá trình biên dịch xuống gần như bằng không. Điều này có nghĩa là liên kết chủ yếu là một hoạt động đĩa?Tại sao liên kết C++ sử dụng hầu như không có CPU?

Nếu vậy, đây có phải là khu vực chính mà SSD sẽ thực hiện những thay đổi lớn không? Nhưng, tại sao không phải tất cả các tệp OBJ của tôi (hoặc nhiều nhất có thể) được lưu trong RAM sau khi biên dịch để tránh điều này? Với 4   GB RAM Tôi có thể tiết kiệm rất nhiều quyền truy cập đĩa và làm cho CPU bị ràng buộc lại, phải không?

Cập nhật: nên rõ ràng theo dõi là, thể VC++ biên dịch và mối liên kết nói chuyện với nhau tốt hơn để sắp xếp mọi thứ và giữ các tập tin OBJ trong bộ nhớ, tương tự như cách Delphi đúng không?

+0

Tôi _speculate_ nó còn lại để hệ điều hành để lưu trữ chúng trong RAM để tránh điều này, mà nó, nếu có đủ RAM để làm như vậy trên đầu biên dịch. Kể từ khi biên dịch mất rất nhiều RAM, điều đó có thể khiến hệ điều hành xóa các tệp OBJ ra đĩa. Nếu bạn buộc nó giữ các tệp OBJ trong bộ nhớ để làm cho liên kết nhanh hơn, do đó nó sẽ làm cho việc biên dịch vẫn chậm hơn nhiều. –

Trả lời

6

Khi gỡ lỗi xây dựng trong Visual Studio, bạn có thể sử dụng incremental linking cho phép bạn thường tránh được rất nhiều thời gian cho việc liên kết. Về cơ bản nó có nghĩa là thay vì liên kết toàn bộ tệp EXE (hoặc DLL) từ đầu nó xây dựng dựa trên tệp bạn đã liên kết lần cuối, chỉ thay thế những thứ đã thay đổi.

Tuy nhiên, điều này không được đề xuất cho các bản phát hành vì nó bổ sung thêm một số chi phí trong thời gian chạy và có thể dẫn đến tệp EXE lớn hơn vài lần so với bình thường.

+2

Xin lỗi, Không giải quyết được câu hỏi. –

+0

Nó giải quyết vấn đề tạo ra "thay đổi lớn" trong việc liên kết hiệu suất. – shoosh

+0

huh? ông hỏi nếu một ssd sẽ tăng tốc độ liên kết nếu nó là io ràng buộc. –

12

Liên kết thực sự chủ yếu là hoạt động dựa trên đĩa. Borland Pascal (trở lại trong ngày) sẽ giữ toàn bộ chương trình trong bộ nhớ, đó là lý do tại sao nó sẽ liên kết quá nhanh.

Tệp OBJ của bạn không được lưu trong RAM vì trình biên dịch và trình liên kết là các chương trình riêng biệt. Nếu môi trường phát triển của bạn có trình biên dịch và trình liên kết được tích hợp (thay vì chạy chúng như là một quy trình riêng biệt), nó thực sự có thể giữ mọi thứ trong RAM.

Nhưng bạn sẽ mất khả năng tách môi trường phát triển khỏi trình biên dịch và/hoặc trình liên kết - bạn sẽ phải sử dụng trình biên dịch/trình liên kết tương tự và bạn sẽ không thể chạy trình biên dịch bên ngoài môi trường.

+1

Delphi vẫn làm. – dthorpe

+0

Tôi nghĩ nó có thể, nhưng với các hóa thân khác nhau của Delphi, tôi đã không chắc chắn nếu nó vẫn còn làm. –

+4

Nếu bạn đang chạy trên bất kỳ hệ điều hành hợp lý nào, thông tin sẽ được lưu trong bộ nhớ, giảm bớt sự cần thiết phải có toàn bộ đối tượng được đặt trong bộ nhớ để liên kết. –

7

Bạn có thể thử cài đặt một số tiện ích đĩa RAM và giữ thư mục obj của bạn trên đĩa RAM hoặc thậm chí toàn bộ thư mục dự án. Điều đó sẽ tăng tốc độ đáng kể.

Đừng quên để làm cho nó vĩnh viễn sau đó :-D

+0

đáng giá ... Tôi nghĩ bạn có thể đặt các tệp trung gian để đi một số nơi riêng biệt nên không cần phải vĩnh viễn ngoại trừ nếu các tệp ONJ đi, bạn phải làm toàn bộ mọi lúc. Không chắc chắn nếu nó có giá trị phức tạp, phụ thuộc vào cách hữu ích một đĩa RAM có thể được tự động hóa tất cả điều này –

3

Thật khó để nói chính xác những gì đang diễn mối liên kết lâu như vậy mà không biết làm thế nào nó được tương tác với hệ điều hành. Rất may, Microsoft cung cấp Process Monitor để bạn có thể thực hiện điều đó.

Nó giúp tôi chẩn đoán lỗi với Visual Studio IDE và trình gỡ lỗi mà không cần truy cập nguồn.

6

Trình liên kết Visual Studio phần lớn được liên kết I/O, nhưng phụ thuộc nhiều vào một vài biến.

  1. Liên kết gia tăng (thường gặp trong bản dựng Gỡ lỗi) thường yêu cầu I/O ít hơn nhiều.

  2. Viết tệp PDB (đối với biểu tượng) có thể mất nhiều thời gian. Đó là một nút cổ chai cụ thể mà Microsoft nhắm mục tiêu trong VS 2010. Việc viết PDB bây giờ được thực hiện không đồng bộ. Tôi đã không thử nó, nhưng tôi đã nghe nó có thể giúp liên kết thời gian khá một chút.

  3. Nếu bạn sử dụng tạo mã thời gian liên kết (LTCG) (phổ biến trong Bản dựng phát hành), ban đầu bạn có tất cả I/O thông thường. Sau đó, trình liên kết sẽ gọi lại trình biên dịch để tạo lại mã cho các phần có thể được tối ưu hóa thêm. Phần này thường có nhiều CPU hơn. Tôi không biết liệu trình liên kết có thực sự quay lên trình biên dịch trong một tiến trình riêng biệt hay không (trong trường hợp này bạn vẫn sẽ thấy mức sử dụng CPU thấp cho quá trình liên kết), hoặc nếu quá trình biên dịch được thực hiện trong quá trình liên kết (trong trường hợp này bạn sẽ thấy trình liên kết đi qua các giai đoạn nặng-I/O sau đó là CPU nặng).

Sử dụng SSD có thể trợ giúp với các phần ràng buộc I/O. Đơn giản chỉ cần có một ổ đĩa thứ hai có thể giúp đỡ, quá. Ví dụ, nếu nguồn và các đối tượng của bạn là tất cả trên một ổ đĩa, và bạn viết PDB của bạn vào một ổ đĩa riêng biệt, trình liên kết nên dành ít thời gian chờ đợi cho các nhà văn PDB. Có một ổ đĩa quay thứ hai đã giúp thời gian liên kết của nhóm hiện tại của tôi đáng kể.

+0

+1. Chuyển từ đĩa quay sang SSD có thể tạo ra sự khác biệt đáng kinh ngạc với tốc độ của hầu hết các quy trình xây dựng. Tốc độ tăng thường phải được nhìn thấy để được tin :-). –

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