【发布时间】:2015-11-24 16:50:29
【问题描述】:
对于我的项目,我有一个 R 程序,它多次调用 C 函数,使用 #include <R.h> 和 #include <Rdefines.h> 实现。由于我想尽可能地加快整个算法的速度,所以我直接用 C++ 编写了 R 程序,这样就去掉了 C 和 R 之间的翻译层。
我从 C++ 中调用了以前编码的 C 函数,作为常规函数。我能够进行翻译并获得相同的输出。
查看运行时,我发现 R 的执行速度比 C++ 的快(2m 10 sec vs 2m 50 sec)。为了找出“问题”在哪里,我使用了两个分析器:gprof 和 Valgrind,它们都报告了 C 外部函数 99% 的运行时使用情况。这让我无法解释 30% 的运行时间差异,而 99% 的时间都花在执行相同的 C 代码上。对于 C++ 和 C 的集成,我尝试了 lo 链接 C 目标文件,并链接 C 的所有 .o 创建单个库 (libExternal.a)。您有什么建议可能是造成这种差异的原因吗?
我附上了 valgrind 报告的一部分。外部C函数有下划线。
谢谢!
这里是 C++ 程序上 perf stat -d 的结果: 这里是 R 程序上 perf stat -d 的结果:
我想提醒你,99% 的时间都花在了 C 函数上,这对两者来说都是一样的。在 C++ 代码中,我只是在传递给函数之前创建对象,因此数据应该在内存中并排。谢谢你的帮助
【问题讨论】:
-
请包含您的代码。
-
或包含 一些 代码,这些代码也会显示问题。甚至反例代码。这样做甚至可能足以让您自己找出问题...
-
我无法添加代码,因为它太长而且没有帮助。我可以说解释算法的作用是我正在迭代输入中的数据矩阵,并根据索引创建一些数组来包含一些结果,然后将数组和数据矩阵传递给 c函数,它评估对它们的一些度量,返回一个数组。 R 做同样的事情,但传递的对象是 R 对象,由 c 代码转换为 c 数组。
标签: c++ c r performance