Gần đây, một đồng nghiệp đã chỉ ra rằng việc biên soạn mọi thứ thành một tệp duy nhất tạo ra mã hiệu quả hơn nhiều so với việc biên dịch các tệp đối tượng riêng biệt - ngay cả khi tối ưu hóa thời gian liên kết được bật. Ngoài ra, tổng thời gian biên dịch cho dự án đã giảm đáng kể. Cho rằng một trong những lý do chính để sử dụng C++ là hiệu quả mã, điều này gây ngạc nhiên cho tôi.Tại sao tối ưu hóa trình liên kết lại quá nghèo nàn?
Rõ ràng, khi trình lưu trữ/liên kết tạo thư viện ra khỏi tệp đối tượng hoặc liên kết chúng thành một tệp tối ưu hóa có thể thực thi, thậm chí đơn giản sẽ bị phạt. Trong ví dụ dưới đây, nội tuyến trival chi phí 1,8% về hiệu suất khi được thực hiện bởi trình liên kết thay vì trình biên dịch. Có vẻ như công nghệ trình biên dịch phải được nâng cao đủ để xử lý các tình huống khá phổ biến như thế này, nhưng nó không xảy ra.
chỉnh sửa:
Đây là một ví dụ đơn giản sử dụng Visual Studio 2008:
#include <cstdlib>
#include <iostream>
#include <boost/timer.hpp>
using namespace std;
int foo(int x);
int foo2(int x) { return x++; }
int main(int argc, char** argv)
{
boost::timer t;
t.restart();
for (int i=0; i<atoi(argv[1]); i++)
foo (i);
cout << "time : " << t.elapsed() << endl;
t.restart();
for (int i=0; i<atoi(argv[1]); i++)
foo2 (i);
cout << "time : " << t.elapsed() << endl;
}
Foo.cpp
int foo (int x) { return x++; }
kết quả chạy: 1,8% đạt hiệu suất sử dụng liên kết foo thay của inline foo2.
$ ./release/testlink.exe 100000000
time : 13.375
time : 13.14
Và có, các cờ tối ưu hóa liên kết (/ LTCG) đang bật.
Trình biên dịch nào bạn đang sử dụng? VC++ có một tùy chọn gọi là Toàn bộ chương trình tối ưu hóa mà tôi tin rằng sẽ làm những gì bạn đang yêu cầu. –
Hầu hết các biên dịch hiện đại đều có tùy chọn "tối ưu hóa thời gian liên kết", nhưng nó thường được chọn tham gia vì nó làm chậm đáng kể liên kết. Bạn đã bật nó trong thử nghiệm chưa? Nó thường cho phép nội suy xuyên đối tượng, trong số những thứ khác. –
Một trong những lý do chính cho C++ là * mã nguồn * hiệu quả mã; để áp dụng đối số này cho mã đối tượng là rất quan trọng. – harpo