【发布时间】:2012-11-03 14:49:43
【问题描述】:
我在 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() 调用该函数
【问题讨论】:
-
除非您真正了解并理解 C,否则几乎没有性能提升。至于为什么会发生冻结,这都是关于线程的。我的猜测是 R 会在后台自动执行,而 C 绝对不会。
-
视情况而定。只要您坚持原语,它们应该大致相同。当您编写三个嵌套的 {i,j,k} 循环来实现矩阵乘法时,C 会更快。 (如果你会使用矩阵/向量基元,则不是)
-
补充@RichardJ.RossIII 所说的,永远记住,你不仅仅是在比较语言,你还在比较你在每种语言中的编程能力同时。很难区分为两个。
-
这里是 Rcpp 的example,相对于甚至优化的 R 代码产生了巨大的加速,但最终它们被证明是由于 @wildplasser 指出的原语。在这种情况下,速度优势是因为 Rcpp 正在修改原始对象而不是修改复制的对象。 当 C(++) 代码执行与 R 代码相同的基本操作时,它同样快,但 C 允许更多地控制执行哪些操作。