2012-06-07 21 views
2

我已經看了這個答案的高和低,所以我訴諸張貼在這裏。如果我有一個Linux C++程序調用一個類似於RCpp的R腳本/函數,是否有任何明顯的延遲期望?這會預期甚至合理嗎?如果我從Java JAR文件中使用類似RCaller的東西會怎麼樣?如果它調用相同的R腳本/函數,你認爲C++比Java更快嗎?任何預期的差異? 謝謝C++或Java調用R腳本的RCPP或RCaller的基準測試?

回答

1

我想你想RInside這使得它很容易嵌入到你的C++應用程序的R。它帶有四個目錄中的大量示例,其中包括一些與Qt,Wt(用於webapps)和MPI一起使用的示例。

在該框架中,您在啓動時實例化一次R,然後創建自己的實例。往返延遲將是無論您需要向R實例發送命令的時間,還是無論長R需要(可能佔優勢)還是返回。

RInside使用Rcpp因此您可以獲得完整的對象轉移和所有其他細節。看看RInside的例子,並在rcpp-devel列表上發佈問題。

1

我對R的外部函數接口或RCpp沒有特別的瞭解,但已經與其他很多人合作過了。你的問題不能被肯定地回答。只有一些經驗法則。 FFI的工作是滿足呼叫和被叫環境的假設。這通常是通過從一個到另一個複製來匹配兩種語言的數據佈局。 (這是RCpp的全部內容。)或者你可以非常幸運並且讓它們匹配。如果運行時環境相似或者在語言之間的邊界上移動的數據很小,這可能非常有效:與自函數調用相比,成本更高。由於這個原因,從Fortran調用C通常非常快。如果環境非常不同,則必須複製大型數據結構。副本消耗資源:內存和處理器週期。垃圾收集是環境差異的代名詞:獨立的收藏家很少會(永遠不會閱讀)合作。由於這個原因,R和Java(垃圾收集)都可能需要複製。如果您專門爲C語言編寫C++,則可以在RCpp結構中設置數據,以便不需要任何副本。

我會寫一些從C++開始的小測試,模仿必須通過界面移動的數據量。運行並計時以獲得間接費用。從這你可以做出真正的決定。

+0

回答良好基因。非常感謝在C++中保存數據並使用R的提示。這是我的問題可能與延遲有關的問題。使用Java的垃圾回收器,這也可能是一個真正的問題,因爲我從來沒有真正關心過它,所以也許C++是更明智的選擇。 –