2012-02-17 23 views
5

Câu hỏi đã được hỏi về whether namespace and folder structure would affect performance of an assembly in C#. Các câu trả lời rất hữu ích, nhưng ở những nơi cụ thể cho C# và CLR.Các thư mục và không gian tên có ảnh hưởng đến hiệu năng trong C++ và nền tảng chéo không?

Cấu trúc thư mục và không gian tên ảnh hưởng như thế nào đến hiệu suất của một assembly nếu nó được viết bằng C++ với gcc? Tình huống trên các hệ điều hành khác, chẳng hạn như Linux hoặc Mac OS là gì?

Nếu có bất kỳ vấn đề về hiệu suất đáng kể nào, tôi nên làm gì hoặc tránh làm để tối đa hóa hiệu suất?

Trả lời

8

Cả hệ thống phân cấp thư mục cũng như không gian tên sẽ ảnh hưởng đến mã được biên dịch của bạn. Mã trình biên dịch của bạn sẽ tạo ra sẽ giống nhau. Điều này đi cho tất cả các trình biên dịch và tất cả các hệ điều hành.

+0

Rất thẳng về phía trước cảm ơn bạn :-) –

+1

Không đúng 100% rằng không gian tên không ảnh hưởng đến hiệu suất. Sử dụng một không gian tên ẩn danh có thể cải thiện hiệu suất trong mã của bạn. Xem http://stackoverflow.com/a/25565298/351771 – xioxox

8

Để mở rộng một chút về những gì Kyle nói:

Không gian tên là gì khác hơn là một cách cú pháp cho người sử dụng và trình biên dịch để đặt tên trong xô khác nhau. Chúng tồn tại để cho phép bạn sử dụng tên phổ biến và phù hợp hơn cho mọi thứ mà không phải lo lắng về xung đột với người khác. std::vector là một loại khác với lớp toán học vector. Họ có thể chia sẻ cùng một tên miễn là họ đang ở trong các không gian tên khác nhau.

Theo như trình biên dịch có liên quan, hàm trong không gian tên không khác với hàm ở bất kỳ nơi nào khác. Nó chỉ có một cái tên buồn cười. Thật vậy, các trình biên dịch được phép tự do làm những gì gọi là "mangling tên": khi trình biên dịch thấy std::vector<int>, nó thực sự có thể chuyển đổi thành thứ gì đó như __std~~vector~t~~int32_t~~__ hoặc bất kỳ thứ gì. Thuật toán mangling được chọn để không có tên do người dùng định nghĩa trong không gian tên chung có thể khớp với tên được sử dụng bởi trình quản lý vùng tên. Vì vậy, tất cả các tên miền có phạm vi không gian tên đều tách biệt với các tên trong các không gian tên khác, thậm chí là tên toàn cầu.

Về cơ bản, bước đầu tiên trong quá trình biên dịch là hiệu quả loại bỏ các không gian tên. Do đó, các bước trình biên dịch sau này không có đầu mối gì mà không gian tên nào đó ở trong. Vì vậy, chúng không thể tạo mã từ nó. Và do đó, các không gian tên không thể có bất kỳ ảnh hưởng nào đến tốc độ thực thi của mã được biên dịch.

Thư mục ... không thể có thể vấn đề. Sau khi biên dịch, bạn nhận được một tệp thực thi, thư viện hoặc DLL. Nếu trình biên dịch đã từng thực hiện bất kỳ thế hệ mã nào dựa trên vị trí của tệp nguồn, bạn cũng nên tránh trình biên dịch đó như dịch hạch. Các nhà văn biên dịch sẽ phải trolling người dùng của họ để làm cho điều đó xảy ra.

+1

Có một ngoại lệ rất nhỏ đối với tuyên bố thư mục đó; các biến trong các không gian tên chưa được đặt tên bị xáo trộn sao cho tên nội bộ của chúng là duy nhất cho mọi tệp nguồn. Điều đó có nghĩa là 'foo' từ file1.cpp phải khác biệt với' foo' trong file2.cpp, và cũng từ 'foo' trong subdir/file1.cpp. Vì vậy, bạn sẽ mong đợi các tên bị xáo trộn như 'subdir__file1__foo'. – MSalters

+0

Có thể có khá nhiều sự khác biệt trong các tình huống cụ thể giữa 'ld * .o' và' ld b.o a.o', vì hai cuộc gọi đó dẫn đến bố cục icache khác nhau. Mặc dù đó chỉ bị ảnh hưởng gián tiếp bởi cấu trúc thư mục (và không có gì để làm với trình biên dịch, nhưng linker - vì vậy một chút OT mặc dù vẫn khá không intuitiv) – Voo

+0

@NicolBolas Cảm ơn bạn; câu trả lời của bạn rất thông tin! :-D –

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