为何Eigen::Matrix列计算比单独Eigen::Vector计算更慢?
问题原因分析
1. 临时引用对象带来的额外拷贝开销
直接操作Eigen::Matrix的列时,matrix.col(i)返回的是一个Eigen::Block类型的列引用对象,而非直接指向连续内存的数组。当你将计算结果直接赋值给这个引用时,Eigen会先把计算结果存入临时对象,再将临时对象的数据拷贝到矩阵列对应的内存区域——这就比直接操作Eigen::Vector多了一次完整的内存拷贝,直接导致耗时翻倍。
而单独的Eigen::Vector本身就是连续内存的直接封装,计算结果可以直接写入目标内存,没有额外的拷贝步骤。
2. 编译器优化的适配差异
开启O2/O3等高级优化时,Eigen::Vector的连续内存操作更容易被编译器识别,触发向量化、内存预取等针对性优化。但矩阵列的Block引用会增加代码的复杂度,编译器可能无法完全优化掉临时对象的创建与拷贝逻辑,导致优化效果打折扣。
当你把输出作为Eigen::VectorXd&类型的参数传入函数时,目标内存的连续属性明确,编译器可以直接将计算结果写入指定内存,消除了临时对象的开销,性能自然与单独使用Vector的测试对齐。
3. 内存访问的额外计算开销
列主序矩阵的列虽然是连续内存,但通过col(i)访问时,Eigen内部需要额外计算列的内存偏移(从矩阵起始地址到目标列的距离),还可能包含边界检查逻辑。这些微小的开销在大规模循环或计算中会被累积放大,而Eigen::Vector的内存访问是直接的,没有这些额外计算步骤。
内容的提问来源于stack exchange,提问作者Vitaly Borzenkov
相关产品推荐
相关产品推荐

