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

pen*_*owe 8 c++ performance boost compilation visual-studio-2012

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

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

同样,我们过去需要大约10分钟才能生成的库(大型)之一需要长达一个小时.我已经四处搜索了有关如何通过预编译的头文件,宏等来改进它的文档,但还没有找到任何可以大大改善这种情况的东西.

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

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

我们正在使用VS2012和大量的RAM /磁盘/等.

Jen*_*ens 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;
};
Run Code Online (Sandbox Code Playgroud)

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

// 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;
};
Run Code Online (Sandbox Code Playgroud)

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