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

时间:2015-11-24 16:50:30

标签: 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秒)。找出&#34;问题&#34;我使用过两个分析器: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 ++代码中,我只是在传递给函数之前创建对象,因此数据应该在内存中并排。谢谢你的帮助

1 个答案:

答案 0 :(得分:2)

显然,内存布局/内存访问可能在这里起决定性作用。基本上,如果CPU在函数X()中花费99%的时间,那么它并不意味着它确实在做任何事情。很可能CPU正在等待数据传递,一个实现等待的次数少于(或更多)。

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

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