我们有一个大型代码库,多年来已成功使用 boost::signals。我们最近转向 boost v1.54,并决定由于 boost::signals 已被弃用,我们将切换到 boost::signals2。
我们看到的问题是编译时间太长了。例如,一个小的 .cpp 文件现在需要 20 多秒,而过去需要 4 秒。
同样,过去需要大约 10 分钟才能生成的我们的一个库(大型)现在最多需要一个小时。我到处搜索有关如何通过预编译头文件、宏等改进这一点的文档,但还没有找到任何可以大大改善这种情况的方法。
在 procmon 中查看 cl.exe 会发现大量 IO 进入 boost::signals2 和 mpl 库。
此时我们不需要 signals2 提供的线程安全,我们即将停止“升级”并恢复信号。在我们放弃之前,有人对此有任何建议或经验吗?
我们正在使用 VS2012 和大量 RAM/磁盘/等。
最佳答案
在我参与的一个项目中,所有 boost 信号的使用都经过处理,因此前向声明就足够了。这显着减少了编译时间,因为 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;
};
然后成为仅包含前向声明且不包含 boost signals2 header 的 header :
// 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 header 。值得注意的是,根据我的经验,大部分时间都不是花在编译器中的解析上,而是花在链接器上。每个使用 boost 信号的编译单元都包含许多实例化函数,这些函数会生成调试信息,最后必须由链接器消除。考虑到 MS 链接器是单线程的并且非常慢,这就是花时间做 IO 的地方。 SSD 在这里提供了很好的 boost 。
关于c++ - 使用 boost::signals2 编译时间非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18005175/