我在R中写了一个Gibbs采样器并决定将它移植到C以查看它是否会更快.我看过的很多页面声称C的速度会快50倍,但每次使用它时,它只比R快了大约五六倍.我的问题是:这是预期的,还是我没有使用哪些技巧会使我的C代码明显快于此(就像使用矢量化加速R中的代码一样)?我基本上接受了代码并在C中重写了它,用for循环替换矩阵操作并使所有变量指针.
另外,从R程序员的角度来看,有没有人知道C的良好资源? Matloff有一本名为The Art of R Programming的优秀书籍,但似乎是从已经认识C的人的角度写的.
此外,当我的C代码在Windows的标准R GUI中运行时,屏幕趋于冻结.它没有崩溃;一旦代码完成运行,它就会解冻,但它阻止我在GUI中做任何其他事情.有谁知道我怎么能避免这个?我正在使用.C()调用该函数
解决方法
许多现有帖子都有明确的例子可以运行,例如Darren Wilkinson在他的博客上有几个帖子用不同的语言分析,后来甚至在不同的硬件上(例如将他的高端笔记本电脑与他的上网本和Raspberry Pi进行比较) ).他的一些帖子是
> the initial (then revised) post
> another later post
他的网站上还有更多 – 这些通常比较C,Java,Python等.
现在,我也把它变成了一个使用Rcpp的版本 – 见this blog post.我们在今年夏天的useR中使用了相同的例子来比较Julia,Python和R / C,所以你应该找到很多其他的例子和参考. MCMC被广泛使用,并且“轻松选择”加速.
鉴于这些例子,请允许我补充一点,我不同意您收到的两个早先的评论.速度不会相同,在这样的例子中很容易做得更好,而你的C/C++技能将主要决定好多少.
最后,一个经常被忽视的方面是RNG的速度很重要.运行循环并添加东西很便宜 – 做“好”抽取不是,并且很多系统间的变化也来自于此.