Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ R调用C代码的速度比C++;对C代码的函数调用?_C++_C_R_Performance - Fatal编程技术网

C++ R调用C代码的速度比C++;对C代码的函数调用?

C++ R调用C代码的速度比C++;对C代码的函数调用?,c++,c,r,performance,C++,C,R,Performance,对于我的项目,我有一个R程序,它多次调用C函数,使用\include和\include实现。由于我想尽可能快地完成整个算法,所以我直接用C++对R程序进行编码,从而删除C和R之间的转换层。 我把C++的前编码函数称为正则函数。我能够进行翻译并获得相同的输出 查看运行时,我发现R执行速度比C++快(2M 10秒vs 2M 50秒)。为了找出“问题”在哪里,我使用了两个分析器:gprof和Valgrind,这两个分析器都报告了C外部函数99%的运行时使用率。这并没有解释运行时间30%的差异,而99%

对于我的项目,我有一个R程序,它多次调用C函数,使用
\include
\include
实现。由于我想尽可能快地完成整个算法,所以我直接用C++对R程序进行编码,从而删除C和R之间的转换层。 我把C++的前编码函数称为正则函数。我能够进行翻译并获得相同的输出

查看运行时,我发现R执行速度比C++快(2M 10秒vs 2M 50秒)。为了找出“问题”在哪里,我使用了两个分析器:gprof和Valgrind,这两个分析器都报告了C外部函数99%的运行时使用率。这并没有解释运行时间30%的差异,而99%的时间都花在执行相同的C代码上。对于C++和C的集成,我已经尝试了LO链接C对象文件,并链接C的所有O。你有什么建议可以解释这种差异的原因吗

我附上了瓦尔格林报告的一部分。外部C函数加下划线

谢谢大家!

这里的C++程序中的PrF STAT -D结果: 这里是R程序上perf stat-d的结果:


我想提醒你99%的时间都花在C函数上,这两个函数都是一样的。在C++代码中,我只在传递给函数之前创建对象,所以数据应该并列在内存中。感谢您的帮助

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

我建议使用
perf
suite、缓存命中和未命中等进行检查


链接:

请包括您的代码。或者包括一些显示问题的代码。甚至是反例代码。这样做甚至可能足以让您自己解决问题……我无法添加代码,因为它太长,而且没有帮助。为了解释算法的作用,我可以说,我正在迭代输入中的一个数据矩阵,根据索引,我动态地创建一些数组来包含一些结果,然后我将数组和数据矩阵传递给c函数,该函数对它们的一些度量进行评估,并返回一个数组。R也会这样做,但传递的对象是R对象,由c代码转换为c数组。CPU没有在函数中等待数据。C++将一个矩阵和一些数组作为指针传递,这些函数由函数使用。你是对的,这可能是一个缓存/内存问题,但我无法理解,因为数组是在传递时创建的,它们在ram中的位置应该是一个挨着另一个。
CPU不是在函数中等待数据。
-wll,CPU几乎总是在等待数据,这是现代野兽的本性,这就是为什么我们有多级缓存和访问时间的层次结构。唯一的问题是他们要等多久。你试过性能统计吗?我在两种情况下都添加了性能统计-d结果。谢谢你的帮助,但是很多打给stat的电话都不一样results@Nadir非常有趣!因此,在第一种情况下,它实际上是一个更好更快的代码,具有更多IPC的代码-2.36指令/周期,而不是2.01指令/周期。但是在第一种情况下,只需要执行更多的指令-~1320 trln vs~860 trln。这就是为什么它要慢。我敢说这是由于不同的优化水平,-O1和-O3?没有内联还是积极内联?