我正在嘗試瞭解最近的性能基準。我們有一個較大的腳本,在Redhat Linux機器上,性能比規格可比的Windows 7筆記本電腦慢50%。 Linux機器使用kvm進行虛擬化,並將16個內核分配給4個內核。該腳本不是密集型的,但有很多循環。主要是想知道是否有可用於優化的R編譯選項或者可能有助於使其更具可比性的任何內核編譯器選項。任何指針將不勝感激。我會試着讓另一臺機器使用原料金屬進行測試,以便進行更好的比較。如何優化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
我們原先認爲的性能問題的原因是通過與VM超線程造成的,但是這竟然是不正確的,性能是一個裸機在同一比較。
我們後來意識到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位版本,但未看到使用32位版本RHEL 6重新加載性能的改進。3)
我發現這個鏈接,但它只解釋了一些64位機器上15-20%的命中。
http://www.hep.by/gnu/r-patched/r-admin/R-admin_51.html
對不起,我不能合法地發佈腳本。
您提到了4個核心:Unix作業是否並行化,Windows不是?這可能是開銷太大了嗎? –
兩臺機器上的腳本都是一樣的。它確實需要進行優化。有相當多的部分在數據框中使用[]偏移,而不是使用apply函數。我已經研究過使用並行庫來加速代碼的這些部分,但除非Windows有某些功能默認啓用並行優化,否則腳本沒有平行部分。筆記本電腦有8個vs 4個內核,但該腳本沒有使用所有內核。感謝您的觀察,但我不認爲這種差異是由於在這種情況下的流程分配。 –
我會考慮將帖子的標題更改爲反映您正在嘗試(並最終從下面的答案中獲得成功)的內容,以便跨平臺**優化R使用**。就目前而言,我可能會把這個問題看作是另一個問題:「如何讓我的R代碼更快地運行[例如,通過向量化,避免重複分配,使用'data.table'等等]?」題。 –