对于我的项目我有一个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函数带有下划线。
谢谢!
这里是关于C ++程序的perf stat -d的结果: 这里是R程序的perf stat -d的结果:
我想提醒你,99%的时间花在了C函数上,两者都是一样的。在C ++代码中,我只是在传递给函数之前创建对象,因此数据应该在内存中并排。谢谢你的帮助
答案 0 :(得分:2)
显然,内存布局/内存访问可能在这里起决定性作用。基本上,如果CPU在函数X()中花费99%的时间,那么它并不意味着它确实在做任何事情。很可能CPU正在等待数据传递,一个实现等待的次数少于(或更多)。
我建议使用perf
套件检查,缓存命中和未命中等。