7

我在 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() 调用该函数

4

4 回答 4

15

许多现有的帖子都有可以运行的明确示例,例如 Darren Wilkinson 在他的博客上有几篇帖子用不同的语言分析这个,后来甚至在不同的硬件上(例如,将他的高端笔记本电脑与他的上网本和 Raspberry Pi 进行比较)。他的一些帖子是

在他的网站上还有更多——这些通常比较 C、Java、Python 等等。

现在,我还使用Rcpp将它变成了一个版本——请参阅 这篇博文。今年夏天,我们还在 useR 上使用了相同的示例来比较 Julia、Python 和 R/C++,因此您应该可以找到很多其他示例和参考资料。MCMC 被广泛使用,并且是加速的“容易选择”。

鉴于这些示例,请允许我补充一点,我不同意您之前收到的两个评论。速度不会一样,在这样的示例中很容易做得更好,而您的 C/C++ 技能将主要决定好多少。

最后,一个经常被忽视的方面是RNG的速度很重要。运行循环并添加东西很便宜 - 做“好”的平局不是,而且很多系统间的变化也来自于此。

于 2012-11-15T01:38:59.240 回答
2

关于 GUI 冻结,您可能需要时不时地R_CheckUserInterrupt打电话R_ProcessEvents

于 2012-11-15T11:17:37.027 回答
2

我想说 C 做得好,比 R 快得多。

您可以尝试一些简单的收获:将编译器设置为优化以提高速度。使用 -march 标志编译。此外,如果您使用的是 VS,请确保您使用的是发布选项进行编译,而不是调试。

于 2016-10-12T17:11:01.977 回答
1

您观察到的性能差异将取决于许多因素:您正在执行的操作类型、您如何编写 C 代码、您使用什么类型的编译器级优化、您的目标 CPU 架构等。

您可以编写基本的、草率的 C 语言,并获得可以正常运行和运行的东西。您还可以针对目标 CPU 的独特特性微调您的代码 - 可能调用专门的汇编指令 - 并从代码中榨取您所能获得的每一滴性能。您甚至可以编写运行速度明显于 R 版本的代码。C 为您提供了很大的灵活性。这里的限制因素是您希望投入多少时间来编写和优化 C 代码。

反之亦然(此处重复上一段,但交换“C”和“R”)。

我不是想听起来很滑稽,但你的问题真的没有一个直截了当的答案。判断您的 C 版本的速度有多快的唯一方法是两种方式编写代码并对其进行基准测试。

于 2012-11-15T01:59:08.643 回答