我在R中写了一个Gibbs采样器并决定将它移植到C以查看它是否会更快。我看过很多页面声称C的速度会快50倍,但每次使用它时,它只比R快了大约五六倍。我的问题是:这是预期的,还是我没有使用哪些技巧会使我的C代码明显快于此(就像使用矢量化加速R中的代码一样)?我基本上接受了代码并在C中重写了它,用for循环替换矩阵操作并使所有变量都成为指针。
另外,从R程序员的角度来看,有没有人知道C的良好资源? Matloff有一本名为 R Programming of Art of R Programming 的优秀书籍,但它似乎是从已经认识C的人的角度编写的。
此外,当我的C代码在Windows的标准R GUI中运行时,屏幕会冻结。它没有崩溃;一旦代码完成运行,它就会解冻,但它阻止我在GUI中做任何其他事情。有谁知道我怎么能避免这个?我正在使用.C()
调用该函数答案 0 :(得分:15)
许多现有帖子都有明确的例子你可以运行,例如Darren Wilkinson在他的博客上有几个帖子用不同的语言分析它,后来甚至在不同的硬件上(例如比较他的结束笔记本到他的上网本和Raspberry Pi)。他的一些帖子是
并且他的网站上还有更多 - 这些通常比较C,Java,Python等。
现在,我也将其转换为使用Rcpp的版本 - 请参阅this blog post。今年夏天我们在useR中使用相同的例子来比较Julia,Python和R / C ++,所以你应该找到很多其他的例子和参考。 MCMC被广泛使用,并且“轻松选择”加速。
鉴于这些例子,请允许我补充一点,我不同意您收到的前两条评论。速度不是相同的,在这样的例子中很容易做得更好,而你的C / C ++技能将主要决定好多少。
最后,一个经常被忽视的方面是RNG 的速度很重要。运行循环并添加东西很便宜 - 做“好”抽取不是,并且很多系统间的变化也来自于此。
答案 1 :(得分:2)
关于GUI冻结,您可能希望不时地调用R_CheckUserInterrupt
和R_ProcessEvents
。
答案 2 :(得分:2)
我会说C,做得恰当,比R快得多。
您可以尝试一些轻松的收获: 将编译器设置为优化以获得更快的速度。 使用-march标志进行编译。 此外,如果您使用VS,请确保使用发布选项进行编译,而不是进行调试。
答案 3 :(得分:1)
您观察到的性能差异取决于许多因素:您正在执行的操作类型,编写C代码的方式,您使用的编译器级优化类型,目标CPU架构等等。 / p>
你可以编写基本的,草率的C并获得有效的运行和运行的东西。您还可以针对目标CPU的独特特性(可能调用专门的汇编指令)微调代码,并从代码中挤出最后一滴性能。您甚至可以编写比R版本显着更慢的代码。 C为您提供了很大的灵活性。这里的限制因素是您希望将多少时间用于编写和优化C代码。
相反的情况也是如此(复制前一段,但交换“C”和“R”)。
我不是想听起来很滑稽,但对你的问题来说真的没有直截了当的答案。判断C版本速度有多快的唯一方法是双向编写代码并对其进行基准测试。