2013-08-01 56 views
8

Chúng tôi có một codebase lớn đã sử dụng thành công boost :: tín hiệu trong nhiều năm. Gần đây, chúng tôi đã chuyển sang phiên bản v1.54 và quyết định rằng kể từ khi tăng :: tín hiệu không được chấp nhận, chúng tôi sẽ chuyển sang tăng :: signal2.Thời gian biên dịch với tăng :: signal2 rất chậm

Vấn đề chúng ta đang thấy là thời gian biên dịch thật khủng khiếp. Ví dụ: một tệp .cpp nhỏ giờ sẽ mất 20 + giây khi nó được sử dụng để mất 4.

Tương tự, một trong các thư viện của chúng tôi (lớn) được sử dụng mất khoảng 10 phút để tạo ngay bây giờ mất tối đa một giờ. Tôi đã tìm kiếm tất cả các tài liệu về cách cải thiện điều này thông qua các tiêu đề được biên dịch sẵn, các macro, v.v ... nhưng vẫn chưa tìm thấy bất cứ điều gì cải thiện tình hình rất nhiều.

Xem cl.exe trong procmon tiết lộ một lượng lớn IO vào thư viện boost :: signal2 và mpl.

Chúng tôi không cần sự an toàn của luồng mà các tín hiệu 2 cung cấp tại thời điểm này, chúng tôi gần kéo phích cắm lên 'nâng cấp' và hoàn nguyên về tín hiệu. Có ai có bất cứ đề nghị hoặc kinh nghiệm với điều này trước khi chúng tôi bỏ?

Chúng tôi đang sử dụng VS2012 với nhiều RAM/đĩa/v.v.

+1

Bạn có đang sử dụng các tiêu đề được biên dịch trước không? –

+8

Signals2 sử dụng các mẫu variadic, chúng được mô phỏng trong VS2012 với chi phí đáng kể. Đã sửa trong VS2013. Giữa Boost thích nghi với điều đó và VS2013 hạ cánh trên máy tính của bạn, hãy cho nó một vài tháng. –

+0

@HansPassant Cảm ơn thông tin, tôi đã không xem xét điều đó. Do chúng tôi không thể chờ VS2013 là hành động tốt nhất để hoàn nguyên về thư viện tín hiệu theo ý kiến ​​của bạn? Như bây giờ, mã không sử dụng được do thời gian biên dịch chậm. – pennyowe

Trả lời

6

Trong một dự án tôi đã làm việc trên, tất cả các thông báo tăng cường tín hiệu được pimpled như vậy mà tờ khai về phía trước là đủ. Điều này làm giảm đáng kể thời gian biên dịch vì các định nghĩa signal2 chỉ được phân tích cú pháp khi thực sự cần thiết. Thay vì cung cấp một thành viên public boost::signals2::signal, lớp này có một thành phần private :: std duy nhất và cung cấp một hàm connectToX công khai trả về một đối tượng std :: unique_pointer.

class Subject { 
public: 
    boost::signals2::signal<void (int)> valueChanged; 
    void setValue(int x) { 
     valueChanged(x); 
    } 
}; 

class A { 
public: 
    A(Subject& subject): conn(subject.sig.connect([&](int x) {this->onChange(x);}) {} 
    ~A() {conn.disconnect();} 
private: 
    void onChange(x) {} 

    boost::signals2::connection conn; 
}; 

sau đó trở thành một tiêu đề với chỉ về phía trước tờ khai và không bao gồm các tiêu đề signals2 tăng:

// Header file 
class Subject { 
public: 
    std::unique_ptr<boost::signals2::connection> connect(std::function<void (int)> observer); 

private: 
    class Impl; 
    std::unique_ptr<Impl> mImpl; 
}; 

Lớp học không quan tâm đến tín hiệu bây giờ không cần phải phân tích tiêu đề signals2. Điều đáng chú ý là trong kinh nghiệm của tôi hầu hết thời gian không được phân tích cú pháp trong trình biên dịch, nhưng trong trình liên kết. mọi đơn vị biên dịch sử dụng các tín hiệu tăng cường đều chứa rất nhiều hàm khởi tạo tạo thông tin gỡ lỗi và phải được loại bỏ bởi trình liên kết ở cuối. Và cho rằng các liên kết MS là đơn luồng và thực sự chậm, đây là nơi mà thời gian được chi tiêu làm IO. Một SSD cung cấp một tốc độ tốt đẹp ở đây.

+0

Cảm ơn phản hồi này. Đây là một ý tưởng rất hay (mặc dù thật không may là việc nhảy như vậy là cần thiết). Chúng tôi đã không xem xét sử dụng một pimpl trong trường hợp của chúng tôi chủ yếu là do việc sử dụng đã được phổ biến rộng rãi rằng sự thay đổi sẽ là đáng kể. Một nếp nhăn khác là các máy khách của các tín hiệu vào các thời điểm sử dụng mô hình scoped_connection. Hiện tại, chúng tôi đang nâng cấp các tệp dự án của mình lên VS2013 vì vậy tôi sẽ quan tâm để xem ý kiến ​​của @Hans Passant ở trên có đúng không. – pennyowe

+0

Vâng, pimpl làm cho nó phức tạp hơn nhiều khi sử dụng tín hiệu, đặc biệt là vì bạn phải trả về unique_ptrs với các kết nối. Tôi khá quan tâm đến kết quả cho VS2013, mặc dù tôi không làm việc trên một nền tảng cửa sổ vào lúc này. Tôi sẽ không mong đợi quá nhiều cải tiến bởi vì mối liên kết chưa được cải thiện rất nhiều, và đây là thời gian xây dựng của chúng tôi được chi tiêu (cùng với việc viết các tệp pdb với rất nhiều tín hiệu tăng tốc). Bạn có thể sử dụng cl/Bt + hoặc link/time + để có được một số phép đo thời gian xây dựng. – Jens