我们有一个很大的代码库,已成功使用boost :: signals多年。我们最近提升了v1.54,并决定由于boost :: signals被弃用,我们将切换到boost :: signals2。
我们看到的问题是编译时间很可怕。例如,一个小的.cpp文件现在需要花费20多秒才能获得4。
同样,我们过去需要大约10分钟才能生成的库(大型)现在需要长达一个小时。我已经四处寻找有关如何通过预编译的头文件,宏等来改进这一点的文档,但还没有找到能够大大改善这种情况的任何内容。
在procmon中查看cl.exe会在boost :: signals2和mpl库中显示大量的IO。
我们不需要信号2提供的线程安全性,此时我们接近在“升级”上拉动插头并恢复信号。在我们放弃之前,有没有人对此有任何建议或经验?
我们正在使用VS2012,有足够的RAM /磁盘/等。
答案 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在这里提供了很好的加速。