2013-08-01 8 views
8

私たちは大きなコードベースを持っています。私たちは最近、v1.54を上げるように動いて、boost :: signalsが廃止されたのでboost :: signals2に切り替えることにしました。boost :: signals2でコンパイルする時間が非常に遅い

私たちが見ている問題は、コンパイル時間が恐ろしいことです。例えば、小さな.cppファイルは、以前は4を取るのに20 +秒かかるでしょう。

同様に、生成に約10分かかりました私たちのライブラリ(大)の1つは、今では最大1時間かかります。私は、プリコンパイルされたヘッダー、マクロなどを使ってこれを改善する方法についてドキュメントを探し求めましたが、状況を大幅に改善するものはまだ見つけていません。

procmonでcl.exeを表示すると、boost :: signals2とmplライブラリに大量のIOが表示されます。

signal2が提供するスレッドの安全性は、この時点では「アップグレード」のプラグを引っ張って信号に戻すことに近いものです。私たちがあきらめる前に誰かがこれに関する提案や経験を持っていますか?

私たちはたくさんのRAM /ディスク/などでVS2012を使用しています。

+1

プリコンパイル済みヘッダーを使用していますか? –

+8

Signals2はvariadicテンプレートを使用していますが、VS2012でかなりのコストでエミュレートされています。 VS2013で修正されました。それに適応したブーストとデスクトップ上のVS2013ランディングの間に、数ヶ月を要します。 –

+0

@HansPassant情報をいただき、ありがとうございました。 VS2013があなたの意見でシグナルライブラリに戻っていく最善の方法ですか?今のように、コードはコンパイル時間が遅いために使用できません。 – pennyowe

答えて

6

私が取り組んでいたプロジェクトでは、すべてのブースト信号の使用法が前向き宣言で十分であるようにしました。これは、実際に必要なときにのみsignals2の定義が解析されるため、コンパイル時間を大幅に短縮します。 public boost::signals2::signalメンバを提供する代わりに、このクラスはprivate std :: unique_pointerメンバを持ち、std :: unique_pointerオブジェクトを返すpublic connectToX関数を提供します。

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; 
}; 

だけ前方宣言なしでヘッダなるブースト信号S2ヘッダの含む:シグナルに興味がない

// 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; 
}; 

クラスは現在、信号S2ヘッダを解析する必要はありません。私の経験では、ほとんどの時間はコンパイラで解析するのに費やされるのではなく、リンカーに費やされていることに注意してください。ブースト信号を使用するすべてのコンパイル単位には、デバッグ情報を生成する多くのインスタンス化された関数が含まれており、最後にリンカーによって削除する必要があります。そして、MSリンカがシングルスレッドであり、実際には遅いことを考えると、これがIOの処理に費やされる時間です。 SSDは素晴らしいスピードアップを提供しました。

+0

このフィードバックをいただきありがとうございます。これは非常に良いアイデアです(しかし、そのようなダンスが必要であることは残念です)。私たちは、主に使用が非常に広範囲であったために、私たちのケースでは、変化が相当なものであると考えていた。もう一つの問題は、シグナルのクライアントがscoped_connectionパラダイムを使用することがあることです。 プロジェクトファイルをVS2013にアップグレードしていますので、上記の@Hans Passantのコメントが真であるかどうか確認することになります。 – pennyowe

+0

はい、pimplはシグナルを使用する方がはるかに複雑です。特に、接続でunique_ptrsを返さなければならないためです。 VS2013の結果にはかなり興味がありますが、現時点ではWindowsプラットフォームでは動作しません。私は、リンカが大幅に改善されていないため、多くの改善は期待できません。これは、ビルド時間が費やされた場所です(ブースト信号のインスタンシエーションがたくさんあるpdbファイルを作成することと同じです)。 cl/Bt +またはlink/time +を使用して、ビルド時間の測定値を取得することができます。 – Jens