使用boost :: signals2编译时间非常慢

时间:2013-08-01 21:44:34

标签: c++ performance boost visual-studio-2012 compilation

我们有一个很大的代码库,已成功使用boost :: signals多年。我们最近提升了v1.54,并决定由于boost :: signals被弃用,我们将切换到boost :: signals2。

我们看到的问题是编译时间很可怕。例如,一个小的.cpp文件现在需要花费20多秒才能获得4。

同样,我们过去需要大约10分钟才能生成的库(大型)现在需要长达一个小时。我已经四处寻找有关如何通过预编译的头文件,宏等来改进这一点的文档,但还没有找到能够大大改善这种情况的任何内容。

在procmon中查看cl.exe会在boost :: signals2和mpl库中显示大量的IO。

我们不需要信号2提供的线程安全性,此时我们接近在“升级”上拉动插头并恢复信号。在我们放弃之前,有没有人对此有任何建议或经验?

我们正在使用VS2012,有足够的RAM /磁盘/等。

1 个答案:

答案 0 :(得分:6)

在我参与的一个项目中,所有提升信号的使用都是粉红色的,因此前向声明就足够了。这大大减少了编译时间,因为signal2定义仅在实际需要时进行解析。该类没有提供公共boost::signals2::signal成员,而是有一个私有的std :: unique_pointer成员,并提供一个返回std :: unique_pointer对象的公共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;
};

然后成为只有前向声明的头,并且不包含boost signals2 headers:

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

现在对信号不感兴趣的类不需要解析signals2标头。值得注意的是,根据我的经验,大多数时间不是在编译器中解析,而是在链接器中。每个使用boost信号的编译单元都包含许多实例化函数,这些函数生成调试信息,最后必须由链接器消除。鉴于MS链接器是单线程的并且非常慢,这就是花费在IO上的时间。 SSD在这里提供了很好的加速。