- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在为计算力学使用 Eigen 编写一个通用库,主要处理 6x6 大小的矩阵和 6x1 大小的 vector 。我考虑使用 Eigen::Ref<>
模板使其也可用于段和 block ,如 http://eigen.tuxfamily.org/dox/TopicFunctionTakingEigenTypes.html 中所述和 Correct usage of the Eigen::Ref<> class
然而,一个小的性能比较表明 Eigen::Ref
与标准的 c++ 引用相比,这种小函数的开销相当大:
#include <ctime>
#include <iostream>
#include "Eigen/Core"
Eigen::Matrix<double, 6, 6> testRef(const Eigen::Ref<const Eigen::Matrix<double, 6, 6>>& A)
{
Eigen::Matrix<double, 6, 6> temp = (A * A) * A;
temp.diagonal().setOnes();
return temp;
}
Eigen::Matrix<double, 6, 6> testNoRef(const Eigen::Matrix<double, 6, 6>& A)
{
Eigen::Matrix<double, 6, 6> temp = (A * A) * A;
temp.diagonal().setOnes();
return temp;
}
int main(){
using namespace std;
int cycles = 10000000;
Eigen::Matrix<double, 6, 6> testMat;
testMat = Eigen::Matrix<double, 6, 6>::Ones();
clock_t begin = clock();
for(int i = 0; i < cycles; i++)
testMat = testRef(testMat);
clock_t end = clock();
double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
std::cout << "Ref: " << elapsed_secs << std::endl;
begin = clock();
for(int i = 0; i < cycles; i++)
testMat = testNoRef(testMat);
end = clock();
elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
std::cout << "noRef : " << elapsed_secs << std::endl;
return 0;
}
用 gcc -O3
输出:
Ref: 1.64066
noRef : 1.1281
看来 Eigen::Ref
有相当大的开销,至少在实际计算量较低的情况下。另一方面,使用 const Eigen::Matrix<double, 6, 6>& A
的方法如果传递 block 或段,会导致不必要的拷贝:
#include <Eigen/Core>
#include <iostream>
void test( const Eigen::Vector3d& a)
{
std::cout << "addr in function " << &a << std::endl;
}
int main () {
Eigen::Vector3d aa;
aa << 1,2,3;
std::cout << "addr outside function " << &aa << std::endl;
test ( aa ) ;
test ( aa.head(3) ) ;
return 0;
}
输出:
addr outside function 0x7fff85d75960
addr in function 0x7fff85d75960
addr in function 0x7fff85d75980
所以这种方法被排除在一般情况下。
或者,可以使用 Eigen::MatrixBase
制作函数模板,如文档中所述。但是,这对于大型库来说似乎效率低下,并且不能像我的情况那样适应固定大小的矩阵(6x6、6x1)。
还有其他选择吗?大型通用库的一般建议是什么?
提前致谢!
编辑:根据评论中的建议修改了第一个基准示例
最佳答案
与 Ref<>
你付出了失去两个信息的代价(与 Matrix 相比):
这是通用性和最高性能之间的经典权衡。
关于C++ Eigen 库 : Performance overhead of Ref<>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52801001/
我是一名计算机科学专业的学生,当谈到程序和排序时,我经常听到“开销”这个词。这到底是什么意思? 最佳答案 这是建立操作所需的资源。这看起来似乎无关,但却是必要的。 就像当你需要去某个地方时,你可能
很难说出这里问的是什么。这个问题是模棱两可的、含糊的、不完整的、过于宽泛或修辞的,不能以其目前的形式得到合理的回答。如需帮助澄清此问题以便可以重新打开,visit the help center .
我是一名计算机科学专业的学生,当谈到程序和排序时,我经常听到“开销”这个词。这到底是什么意思? 最佳答案 这是建立操作所需的资源。这看起来似乎无关,但却是必要的。 就像当你需要去某个地方时,你可能
我尝试阅读 stackoveflow 上回答的一些问题并根据此更改 eclipse.ini: 现在,除了一个应用程序之外,每个应用程序都可以正常运行。它显示此消息: 无法执行 dex:超出 GC 开销
我用谷歌搜索了这个问题,似乎找不到一致的意见,或者许多基于可靠数据的意见。我只是想知道在 SQL SELECT 语句中使用通配符是否会比单独调用每个项目产生额外的开销。我在几个不同的测试查询中比较了两
假设我们压缩例如 .txt 具有 的文件7 字节大小。压缩后转换为 .zip 文件,大小为 190 字节。 有没有办法估计或计算“开销”的大致大小? 什么因素影响开销大小? Zlib计算开销:他们说:
一段时间以来,我一直在尝试理解 Go 中的 channel 。但有一件事让我感到奇怪。当你打电话时究竟发生了什么, for { select { case <-chan: } } 它是
假设我正在运行N个线程。 每个线程都需要与下一个和上一个同步。 for (i = 0 ; i < NITER; i++){ do_something (); sync_
我需要使用 JDOM 生成 XML 文件,该文件可能相当大。我想知道除了内存中已经存在的数据(主要是字符串)之外,JDOM 还需要多少额外的内存空间。我写了一个简单的程序来测试,结果发现开销大约是XM
我正在学习类(class) 3354(在 .NET Framework 2.0 中实现系统类型和接口(interface))据说对于具有成员变量和函数的简单类,由于开销,最好使用结构而不是类. 我从来
我用 Google 搜索了这个问题,但似乎找不到一致的意见,也找不到许多基于可靠数据的意见。我只是想知道在 SQL SELECT 语句中使用通配符是否会比单独调用每个项目产生额外的开销。我在几个不同的
我正在考虑使用 Clyther用于高性能任务。仅使用 python 编写 OpenCL 内核是令人兴奋的,但我想知道性能差距。 Clyther 擅长的任务是什么?不擅长? Clyther 生成的内核好
我正在将一个项目从gradle版本3.3转换为4.10.1。该项目主要是使用自定义构建步骤构建的C++代码,而不是CMake(externalNativeBuild)或Android.mk(ndkBu
我正在检查一个将大量内容加载到 WebView 中的应用程序的能量分析。我收到以下仪表。我发现能源影响很大,并且开销始终很高(屏幕截图中为 54%)。 能量表的开销统计数据的含义是什么? 最佳答案 开
具体来说,我谈论的更多是 C++ 和 Rust。在 Java 和 C# 具有运行时的意义上,我不明白 C++ 如何具有“运行时”——而 Java 和 C# 运行在具有自身封装抽象等的虚拟机之上,I d
我有这个函数可以在 OpenGL 中打印二维文本 void Text2D::printText(const BMfont &font, const char *text, const PenList
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: C++ virtual function table memory cost 我刚读到:http://www
Error:Execution failed for task ':app:transformClassesWithDexForDebug'. > java.lang.OutOfMemoryError
我正在构建一个动态搜索(每次击键都会更新):我目前的方案是在每次击键时向服务器发送一个新的 AJAX 请求并以 JSON 格式取回数据。 我考虑过为每个搜索“ session ”打开一个 WebSoc
我们正在为基于 Oracle 11gR1 的新系统设计数据库模式。我们已经确定了一个主模式,它有近 100 个表,这些表将从前端 Java 应用程序访问。 我们需要审计接近 50 个表中发生更改的值,
我是一名优秀的程序员,十分优秀!