私が理解しようとしている最近のパフォーマンスベンチマークがあります。Redhat Linuxマシンでは、スペックが同等のWindows 7ラップトップよりもパフォーマンスが50%遅く見える大きなスクリプトがあります。Linuxマシンはkvmを使用して仮想化され、16GBのメモリとともに4つのコアが割り当てられています。スクリプトはioを集中的に使用しませんが、かなりの数のforループがあります。主に、最適化に使用できるRコンパイルオプションや、これをより比較可能にするのに役立つ可能性のあるカーネルコンパイラオプションがあるかどうか疑問に思っています。任意のポインタをいただければ幸いです。比較しやすいように、別のマシンを入手して、生の金属を使用してテストします。
これらは、LinuxマシンでRをコンパイルするために使用しているconfigureフラグです。私はかなりの実験をしましたが、これにより、より大きなデータセットの実行時間が緑色で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
私の最初の疑いと私はまもなくテストし、私の発見で更新することは、KVMLinux仮想化が原因であるということです。このスクリプトは非常にメモリを消費し、多数の配列操作とRがコピーで渡されるため(もちろんmallocする必要があります)、これが問題の原因である可能性があります。VMはメモリコントローラーに直接アクセスできず、他のVMと共有する必要があるため、問題が発生する可能性が非常に高くなります。私は今日の後半に生のマシンを入手し、私の発見で更新します。
迅速な更新をありがとうございました。
アップデート2
当初、パフォーマンスの問題の原因はVMを使用したハイパースレッディングが原因であると考えていましたが、これは正しくないことが判明し、ベアメタルマシンでのパフォーマンスは比較的同じでした。
後で、Windowsラップトップが計算に32ビットバージョンのRを使用していることに気付きました。これにより、64ビットバージョンのRを試してみましたが、まったく同じスクリプトで32ビットよりも約140%遅くなりました。これは、64ビットがRの32ビットバージョンよりも約140%遅くなる可能性があるという疑問に私を導きます。
私たちが見ているのは、32
Windows32ビット実行時間48秒Windows64ビット実行時間2.33秒。
Linux64ビット実行時間2.15秒。Linux 32ビット実行時間<進行中>(RHEL 6.3 x86_64で32ビットバージョンを構築しましたが、32ビットバージョンのRHEL 6.3でリロードするパフォーマンスの向上は見られませんでした)
私はこのリンクを見つけましたが、それはいくつかの64ビットマシンでの15-20%のヒットを説明するだけです。
http://www.hep.by/gnu/r-patched/r-admin/R-admin_51.html
申し訳ありませんが、スクリプトを合法的に投稿することはできません。