2

我对这个答案的看法高低不一,所以我求助于在这里发帖。如果我有一个 Linux C++ 程序调用一个带有 RCpp 之类的 R 脚本/函数,是否会有任何明显的延迟?这是可以预料的,甚至听起来合理吗?如果我使用 Java JAR 文件中的 RCaller 之类的东西怎么办?如果调用相同的 R 脚本/函数,您认为 C++ 仍然比 Java 快吗?任何预期的差异?谢谢

4

2 回答 2

1

我对 R 外部函数接口或 RCpp 没有特别的知识,但与其他一些人合作过。您的问题无法确定地回答。只有一些经验法则。FFI 的工作是满足调用和被调用环境的假设。这通常是通过从一种语言复制到另一种语言来匹配两种语言的数据布局。(这就是 RCpp 的全部意义所在。)或者你可以很幸运并让它们匹配。如果运行时环境相似,或者跨语言边界移动的数据很小,这可能非常有效:不会比 self 函数调用成本高多少。由于这个原因,从 Fortran 调用 C 通常非常快。如果环境差异很大,则必须复制大型数据结构。副本消耗资源:内存和处理器周期。垃圾收集是环境之间差异的典型代表:单独的收集器很少(从不)合作。由于这个原因,R 和 Java(都是垃圾收集)可能需要复制。如果您正在编写专门用于 callL R 的 C++,您可以在 RCpp 结构中设置数据,这样就不需要副本。

我会从 C++ 开始编写一些小测试,以模拟您必须通过界面移动的数据量。运行并计时以获取间接费用。由此你可以做出真正的决定。

于 2012-06-07T18:27:43.887 回答
1

我认为您需要RInside,它可以很容易地将 R 嵌入到您的 C++ 应用程序中。它在四个目录中附带了大量示例,包括一些用于 Qt、Wt(用于 webapps)和 MPI 的示例。

在该框架中,您在启动时将 R 实例化一次,然后拥有自己的实例。往返延迟将是您向 R 实例发送命令所花费的任何时间,加上 R 花费的时间(很可能占主导地位)加上返回。

RInside 使用Rcpp,因此您可以获得整个对象传输和所有其他细节。查看 RInside 示例,并在 rcpp-devel 列表上发布问题。

于 2012-06-07T22:25:49.667 回答