Re: [問題] 請問關於 Rust 跟 C 的速度比較

作者: littleshan (我要加入劍道社!)   2017-08-14 01:32:12
※ 引述《os653 ()》之銘言:
: 最近在練習 Rust,聽說執行速度可以跟 C 相當
: 但看了下面網頁的執行速度比較,似乎 Rust 還是略輸一截
: https://benchmarksgame.alioth.debian.org/u64q/rust.html
: 請問這是為什麼?
: 在我的粗略理解上,Rust 的很多東西都是在編譯期就處理掉了
: 而且因為變數的定義較為嚴格,還有可能編出較短的機械碼
: 那理論上應該會比 C 快才對呀?
Hi, 在開始說明前,建議你可以先看一下 benchmarks game 針對效能比較的說明
https://benchmarksgame.alioth.debian.org/dont-jump-to-conclusions.html
他們開宗明義就講:每個程式語言設計時要達成的目標不一樣
單純地實作相同演算法並比較它們的效能,其實是LP比雞腿
Rust 在設計上的首要目標是 memory safe 與 thread safe
並且在提供高階抽象化的同時,儘可能維持良好的執行效能
而 C 的目標是取代當時 (1973) 雖然效能好但不易跨平台的組合語言
因此它允許 undefined behavior,而且提供許多低階的操作
確實 Rust 在 compile time 就做了許多 safety check 來提高 runtime 效率
但有些與 memory safety 相關的檢查確實很難在 compile time 實現
而 C compiler 根本就不管 memory safety 的
這種時候,Rust 的執行效率確實會比 C 還要慢
最簡單最常見的例子就是陣列存取
像這樣的程式碼:
array[i] = x;
Rust 的效率會明顯低於 C
因為 compiler 無法在 compile time 確認 i 是否落在 array 的長度限制內
為了不引發 undefined behavior,它必需在 runtime 幫你做邊界檢查。
事實上,所有 memory safe 的語言,在這樣的陣列存取時都會做邊界檢查。
大家會說 Rust 的效能很好,多半是與其它 memory safe 的語言比較
比如說 C# / Java / Go,而不是和 C 比較。
* * *
所以 Rust 一定比 C 還要慢嗎?那也不一定。
你可以看看 C 與 C++ 在 benchmarks game 上面的比較,
幾乎所有的測試中 C 都比 C++ 還要快。
但是,如果你比較 C++ 的 std::sort 與 C 的 qsort
那麼 C++ 肯定是壓倒性的勝利
當然,如果要比排序,你還是可以用 C 手刻一個與 C++ sort 相同的版本
但,當你使用某個語言寫程式,而標準函式庫提供了 qsort
你還會手刻一個自己的 sort 出來嗎?
「使用某語言」在一定程度上,包含了「使用某語言的library」
這也算是 benchmarks game 的一項規則
上面的測試程式碼會儘可能使用該語言提供的函式庫
以符合使用該語言寫程式的普遍情況
因此,benchmarks game 上面某個語言的效能,應該要被理解為它的「平均表現」
而不是該語言的「極限」
以 C 與 Rust 的比較中,其中 C 表現得比較好的測試像是 mandelbrot 或 n-body
C 都使用了 SIMD 指令以提昇效率
但是目前 Rust 的 SIMD 尚未成為標準功能,因此範例碼中也未使用 SIMD 加速
這是否表示 Rust 不能用 SIMD 呢?並不是
你真的想做,還是可以用 unsafe block 與 inline asm 做到
但這不會是 Rust programming 的常態
畢竟如果你那麼在意效能,覺得效能比 memory safe 或易讀易寫更重要
那 C 還是比較適合的選擇
作者: FRAXIS (喔喔)   2017-08-14 06:05:00
C 的 qsort 比 C++ 的 std::sort 慢是差在 template?
作者: LPH66 (-6.2598534e+18f)   2017-08-14 07:49:00
可能是; C++ 有 template 所以可以 inline 比較函式但 qsort 一定是(間接)呼叫我沒實測過所以這只是推測就是了
作者: fatrabitree (胖兔子)   2017-08-14 08:49:00
std::sort不是單純quick sort
作者: Sidney0503 (Sidney0503)   2017-08-14 10:31:00
quick sort到一半改用heap sort 這是現在最快的純比較排序法
作者: johnlinvc (阿翔)   2017-08-14 11:31:00
std:sort 用的是 intro sort
作者: freeunixer (御劍客)   2017-08-14 11:57:00
以前都苦幹幾個以下用哪種,幾個以上用哪種,多少要拆.
作者: tinlans ( )   2017-08-14 15:28:00
SGI STL 的 std::sort 不是 quick sort
作者: LPH66 (-6.2598534e+18f)   2017-08-15 00:01:00
喔對, 忘了它是 intro sort...
作者: os653   2017-08-16 22:27:00
感謝說明,其實我也很好奇為啥在C的部分會看到omp的東西想說比速度不是應該用同條件去比才對嗎?照您的說法就說得通了
作者: firejox (Tangent)   2017-08-19 10:47:00
不同的lib的std::sort 實作都不太一樣,clang的好像是5pivot的quick sort

Links booklink

Contact Us: admin [ a t ] ucptt.com