Tôi làm việc cho một công ty có bộ phận "Phần mềm trung gian" để duy trì một vài trăm thư viện thường được nhiều nhóm sử dụng.
Mặc dù ở trong cùng một công ty, chúng tôi chỉ e ngại từ cách tiếp cận đầu trang và thích ưu tiên khả năng tương thích nhị phân so với hiệu suất vì dễ bảo trì.
Sự đồng thuận chung là hiệu suất đạt được (nếu có) sẽ không đáng để gây rắc rối.
Hơn nữa, cái gọi là "mã-bloat" có thể có tác động tiêu cực đến hiệu suất khi nhiều mã được tải trong bộ nhớ cache ngụ ý nhớ cache nhiều hơn, và đó là những kẻ giết hiệu suất.
Trong một thế giới lý tưởng tôi giả sử rằng trình biên dịch và các mối liên kết có thể là đủ thông minh KHÔNG để tạo ra những "nhiều định nghĩa" quy tắc, nhưng miễn là nó không phải là trường hợp, tôi sẽ (cá nhân) ủng hộ:
- khả năng tương thích nhị phân
- phi nội tuyến (đối với phương pháp mà hơn một vài dòng)
Tại sao bạn không thử? Chuẩn bị hai thư viện (chỉ một tiêu đề và phần còn lại không có các phương thức nội tuyến qua một vài dòng) và kiểm tra hiệu năng tương ứng của chúng trong trường hợp CỦA BẠN.
EDIT:
Nó được chỉ ra bởi 'jalf' (nhờ) rằng tôi nên chính xác những gì tôi có nghĩa là chính xác bởi khả năng tương thích nhị phân.
2 phiên bản của một thư viện nhất định được cho là tương thích nhị phân nếu bạn có thể (thường) liên kết với nhau hoặc không có bất kỳ thay đổi nào trong thư viện của riêng bạn.
Vì bạn chỉ có thể liên kết với một phiên bản của một thư viện cụ thể Target
, tất cả thư viện được sử dụng Target
sẽ sử dụng cùng một phiên bản ... và đây là nguyên nhân của sự chuyển đổi của thuộc tính này.
MyLib --> Lib1 (v1), Lib2 (v1)
Lib1 (v1) --> Target (v1)
Lib2 (v1) --> Target (v1)
Bây giờ, nói rằng chúng ta cần một sửa chữa trong Target
cho một tính năng duy nhất được sử dụng bởi Lib2
, chúng tôi cung cấp một phiên bản mới (v2)
.Nếu (v2)
tương thích với (v1)
nhị phân, sau đó chúng ta có thể làm:
Lib1 (v1) --> Target (v2)
Lib2 (v1) --> Target (v2)
Tuy nhiên, nếu nó không phải là trường hợp, sau đó chúng tôi sẽ có:
Lib1 (v2) --> Target (v2)
Lib2 (v2) --> Target (v2)
Yep, bạn đọc nó đúng, mặc dù Lib1
làm không yêu cầu sửa chữa, bạn phải xây dựng lại phiên bản này với phiên bản Target
mới vì phiên bản này là bắt buộc đối với các cập nhật Lib2
và Executable
chỉ có thể liên kết với một phiên bản Target
.
Với thư viện chỉ tiêu đề, vì bạn không có thư viện, bạn có hiệu quả không tương thích nhị phân. Do đó, mỗi khi bạn sửa chữa (bảo mật, lỗi nghiêm trọng, v.v ...), bạn cần cung cấp một phiên bản mới và tất cả các thư viện phụ thuộc vào bạn (thậm chí gián tiếp) sẽ phải được xây dựng lại dựa trên phiên bản mới này!
Làm thế nào để tiêu đề chỉ bao hàm sự libs mã sưng lên? Trình biên dịch thường sẽ không nội tuyến nếu nó có nghĩa là mã lớn hơn đáng kể. Và, cho rằng vấn đề, làm thế nào là khả năng tương thích nhị phân bị ảnh hưởng bởi libs tiêu đề chỉ? – jalf
@Matthieu: Thử nghiệm thực sự là luôn luôn tốt để xác định đó sẽ mang lại kết quả tốt nhất. – DrYak
@Jalf: *** 1. Kịch bản chỉ tiêu đề: đối với mỗi thay đổi duy nhất đối với thư viện, bản cập nhật cho thư viện có nghĩa là biên dịch lại mọi dự án cuối cùng có sự phụ thuộc vào nó. (Hãy suy nghĩ về tình hình của Matthieu: hàng trăm thư viện, nhiều nhóm - rất nhiều biên dịch lại liên quan). *** 2. Kịch bản nhị phân duy nhất: đối với nhiều thay đổi khác nhau, bản cập nhật sẽ đơn giản liên quan đến việc thả tệp .SO hoặc .DLL mới, miễn là ABI vẫn giữ nguyên. Mặc dù tính năng mới có thể thay đổi chữ ký phương thức và cấu trúc dữ liệu, các cập nhật quan trọng (bảo mật hoặc tính ổn định) hiếm khi xảy ra. – DrYak