【问题标题】:Eigen copy constructor vs. operator= performanceEigen 复制构造函数与 operator= 性能
【发布时间】:2017-12-05 00:06:18
【问题描述】:

在我的工作中,我使用 Eigen 数学库。我遇到了这样一种行为:在我自己的类的初始化列表中使用 Eigen Matrix 复制构造函数比在构造函数主体中使用 operator= 慢得多。

在这些示例中,“矩阵”是一个静态大小的密集矩阵。

class Slow {
    public:
        Slow(const Matrix &m) : my_matrix{m} {}
    private:
        Matrix my_matrix;
}

class Fast {
    public:
        Fast(const Matrix &m) : my_matrix{} {
            my_matrix = m;
        }
    private:
        Matrix my_matrix;
}

我的程序经常调用我的类的复制构造函数,上面两个选项之间的性能差异非常明显。我验证了生成的程序集实际上是不同的。

我知道 copy-constructor 和 operator= 不一样,但我无法通过 Eigen 源代码找出为什么一个比另一个快。任何具有 Eigen 专业知识的人都可以权衡导致 operator= 速度如此之快的引擎盖下发生的事情吗?洞察力和/或推荐阅读的链接同样受欢迎。

【问题讨论】:

  • 您意识到当您使用operator= 时,您仍然调用了默认构造函数,对吧?您将仅复制构造函数与默认构造函数进行比较,紧随其后的是 operator=
  • 是的,没错。

标签: c++ eigen


【解决方案1】:

在“快速”版本中,副本由 Eigen 通过内联、显式循环展开和显式矢量化手动处理。在“慢”的情况下,copy-ctor 归结为:

template<typename T,int Size>
struct storage {
  T data[Size];
  storage(storage &other)
    : data(other.data)
  {}
};

我们假设编译器已正确优化。不幸的是,如果Size 有点太大,clang 和 gcc 都会将此副本实现为对memcpy 的调用,从而丢失编译时Size 信息。另一方面,让编译器处理这个副本可以实现更高级别的优化,例如在某些情况下临时删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-13
    • 2011-04-08
    • 2013-01-10
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    相关资源
    最近更新 更多