我们有一个最近的性能基准,我想了解它。我们有一个大型脚本,它在 Redhat Linux 机器上的性能似乎比在规格相当的 Windows 7 笔记本电脑上慢 50%。linux 机器使用 kvm 进行虚拟化,分配有 4 个内核以及 16GB 内存。该脚本不是 io 密集型的,但有很多 for 循环。主要是我想知道是否有任何 R 编译选项可用于优化或任何内核编译器选项可能有助于使其更具可比性。任何指针将不胜感激。我将尝试购买另一台机器并使用原始金属进行测试,以便更好地进行比较。
这些是我用来在 linux 机器上编译 R 的配置标志。我已经进行了很多实验,对于较大的数据集,这似乎将绿色的执行时间缩短了 12 秒。基本上我用这些选项从 2.087 秒到 1.48 秒。
./configure CFLAGS="-O3 -g -std=gnu99" CXXFLAGS="-O3 -g" FFLAGS="-O2 -g" LDFLAGS="-Bdirect,--hash-stype=both,-Wl,-O1" --enable-R-shlib --without-x --with-cairo --with-libpng --with-jpeglib
更新 1
该脚本尚未优化。另一组实际上正在编写脚本,我们已经提出使用应用功能的请求,但不确定这如何解释时代差异。
配置文件的顶部看起来像这样。这些功能中的大部分将在以后使用 apply 功能进行优化,但现在它在两台机器上都是苹果对苹果的基准测试。
"eval.with.vis" 8.66 100.00 0.12 1.39
"source" 8.66 100.00 0.00 0.00
"[" 5.38 62.12 0.16 1.85
"GenerateQCC" 5.30 61.20 0.00 0.00
"[.data.frame" 5.20 60.05 2.40 27.71
"ZoneCalculation" 5.12 59.12 0.02 0.23
"cbind" 3.22 37.18 0.34 3.93
"[[" 2.26 26.10 0.38 4.39
"[[.data.frame" 1.88 21.71 0.82 9.47
我的第一个怀疑,我将很快测试并更新我的发现是 KVM linux 虚拟化是罪魁祸首。该脚本非常占用内存,并且由于大量的数组操作和 R 通过副本传递(当然必须 malloc ),这可能会导致问题。由于虚拟机不能直接访问内存控制器,并且必须与它的其他虚拟机共享它,这很可能会导致问题。我将在今天晚些时候得到一台原始机器,并将更新我的发现。
谢谢大家的快速更新。
更新 2
我们最初认为性能问题的原因是由于虚拟机的超线程导致的,但事实证明这是不正确的,相对而言,在裸机上的性能是相同的。
后来我们意识到 Windows 笔记本电脑正在使用 32 位版本的 R 进行计算。这导致我们尝试了 64 位版本的 R,结果在完全相同的脚本上比 32 位版本慢了约 140%。这让我想到了一个问题,64 位版本的 R 怎么可能比 32 位版本慢约 140%?
我们看到的是 32
Windows 32 位执行时间 48 秒 Windows 64 位执行时间 2.33 秒。
Linux 64 位执行时间 2.15 秒。Linux 32 位执行时间<进行中>(在 RHEL 6.3 x86_64 上构建了 32 位版本,但没有看到性能改进,我将使用 RHEL 6.3 的 32 位版本重新加载)
我找到了这个链接,但它只解释了一些 64 位机器上 15-20% 的命中率。
http://www.hep.by/gnu/r-patched/r-admin/R-admin_51.html
抱歉,我不能合法地发布脚本。