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

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

我们有一个大型代码库,多年来已成功使用 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/

相关文章:

c++ - 如何在 C++ 中创建类似于 snprintf 的消息并仅更改消息中的值?

c++ - 为什么 std::vector 这么快(或者我的实现太慢了)

boost - 如何使 boost.build 使用特定的编译器安装?

c++ - 如何在DLL中集成Boost Asio Server

c# - C++/C# 应用程序中的内存泄漏

c# - 比较和对比 C++ 与 C# 命名空间层次结构

mysql - 提高 SQL LIKE 查询性能

javascript - SAPUI5中的最佳实践表

iphone - boost armv7构建

c++ - boost 定时器 : how to get time when I need?