c++ - R 调用 C 代码比 C++ 函数调用 C 代码更快?

标签 c++ c r performance

对于我的项目,我有一个 R 程序,它多次调用 C 函数,使用 #include <R.h> 实现和#include <Rdefines.h> 。由于我想尽可能加快整个算法的速度,因此我直接用 C++ 编写了 R 程序,从而删除了 C 和 R 之间的翻译层。 我从 C++ 中调用了之前编码的 C 函数,将其作为常规函数。我能够进行翻译并获得相同的输出。

查看运行时间,我发现 R 的执行速度比 C++ 的执行速度更快(2m 10 秒 vs 2m 50 秒)。为了找出“问题”出在哪里,我使用了两个分析器:gprof 和 Valgrind,它们都报告了 C 外部函数 99% 的运行时使用情况。这没有给我解释 30% 的运行时间差异,而 99% 的时间都花在执行相同的 C 代码上。对于 C++ 和 C 的集成,我尝试链接 C 目标文件,并链接 C 的所有 .o 创建单个库(libExternal.a)。您对造成这种差异的原因有何建议?

我附上了 valgrind 报告的一部分。外部 C 函数带有下划线。 enter image description here

谢谢!

这是 C++ 程序上 perf stat -d 的结果: enter image description here 这是 R 程序上 perf stat -d 的结果: enter image description here

我想提醒你,99%的时间都花在C函数上,这对于两者来说是一样的。在 C++ 代码中,我只是在传递给函数之前创建对象,因此数据应该在内存中并排放置。谢谢您的帮助

最佳答案

显然,内存布局/内存访问可能在这里发挥决定性作用。基本上,如果 CPU 99% 的时间都花在函数 X() 上,并不意味着它真的在做任何事情。最有可能的是,CPU 正在等待数据传送,并且一种实现比另一种实现等待的时间更少(或更多)。

我建议使用perf套件进行检查,缓存命中和未命中等。

链接:http://www.bnikolic.co.uk/blog/hpc-prof-events.html

关于c++ - R 调用 C 代码比 C++ 函数调用 C 代码更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33899372/

相关文章:

c++ - 根据某些条件在编译时生成字符串

c++ - Linux fork 和 Kill 后停止创建核心转储文件

c++ - 调用函数时是否不支持间接转换?

C++:监视器和条件变量进程间

c - 使用带有信号量和线程的 C 语言进行文件复制,供消费者/生产者使用

在 C/C++ 中创建 "igraph"中的加权无向图

c++ - 如何链接 C++ 以使用静态 C 库中定义的变量(找不到符号错误)

r - 如何获取每个唯一 ID 的摘要

r - 临时键入 data.table 以进行合并

从 ggpairs 中删除 *(重要性)