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

作者: os653   2017-08-12 21:49:05
最近在練習 Rust,聽說執行速度可以跟 C 相當
但看了下面網頁的執行速度比較,似乎 Rust 還是略輸一截
https://benchmarksgame.alioth.debian.org/u64q/rust.html
請問這是為什麼?
在我的粗略理解上,Rust 的很多東西都是在編譯期就處理掉了
而且因為變數的定義較為嚴格,還有可能編出較短的機械碼
那理論上應該會比 C 快才對呀?
作者: loveflames (咕啾咕啾魔法陣)   2017-08-12 22:08:00
你的理論依據沒有一個可以當成比C快的理由應該反過來問,為何你會覺得這些會是速度比較快的原因
作者: CoNsTaR ((const *))   2017-08-13 06:11:00
雖然 rust 可以利用規則來簡化複雜的東西但是相反的,因為 rust 只能照規則走所以不在規則內的 hack 就沒辦法過 type check
作者: os653   2017-08-13 09:49:00
版上的教學網頁有提到void foo(int* x, int* y, const int* z){*x += *z;*y += *z;}這樣一個函數,因為C的編譯器無法確定x、y、z是否是同一塊記憶體位址,而Rust的編譯器可以確定,故C編出來的機械碼會比Rust多一次讀取的動作,就會比較慢一點
作者: CoNsTaR ((const *))   2017-08-13 11:10:00
就說 rust 會在他知道的範圍內把東西做到最簡所以如果 rust 知道所有最快的 hack而且能夠知道同一個語意的所有不同寫法那理論上它會是最快的,但事實是不可能,只能盡力例如說,如果有一種機器,它有一個指令能夠在一個指令周期內做完 foo 做的事,但是 rust 不知道這個指令,或者是rust 不知道直接呼叫那個指令和執行這一串程式碼是相等的(操作語意上),那這兩個情況下 C 內嵌組語都會比 rust快而各個 libc 的實作都用了一大堆這種機器相關的 hack,所以 rust 才會這麼難超過 C至於為什麼我前面說不可能,第一因為這種 hack 可以有無限種,你隨時爽往你的機器上加什麼特性都可以第二因為對於所有正確的敘述,要判斷它們的語意是否相等,常常是 undecidable 的 (有興趣可以參考 logical semantics)所以如果你不知道兩者語意相等,那你就沒辦法用快的取代慢的例如你上面的例子,如果 rust 不能判定少讀一次記憶體位址的語意是否還和原本一樣,那它就沒辦法用少讀一次的版本替換比較慢的版本(雖然這個 case 是可判定的)不知道這樣講有沒有比較清楚…
作者: grayStone (灰色石頭)   2017-08-13 12:48:00
我對樓上的解讀是,沒錯Rust比較快
作者: PkmX (阿貓)   2017-08-13 15:24:00
compiler和library實做完全不一樣啊...
作者: os653   2017-08-13 18:37:00
我想C大的例子就類似用DMA跟以byte為單位讀取資料的差別吧一個用一行指令就完事,一個要用for迴圈跑幾千次這樣Rust平常小勝,遇到可以取巧的指令大輸,結果就變成小輸
作者: james732 (好人超)   2017-08-13 18:49:00
Rust在實作上沒有取巧的空間嗎?
作者: Hazukashiine (私は幸せです)   2017-08-13 20:42:00
@os653 可以用 restrict 提示 C Compiler 那兩個pointer 不會 alias 因此沒有你說的那個問題不存在-s 刪--xx--
作者: LPH66 (-6.2598534e+18f)   2017-08-14 01:48:00
不過 restrict 只有 C99 有, C++ 因為多型的關係狀況複雜restrict 的語意碰上多型會有麻煩所以目前一直都沒有規定(連 restrict 在 C++ 都不是關鍵字)雖然 g++ 有提供 __restrict 給 C++ 用但我不太清楚語意修正一下, 是 C99 以後的 C 才有
作者: ronin728 (浪人)   2017-09-18 08:09:00
那個網站寫測試程式的人都盡量壓榨效能,你可以點code來看看,C語言的code有強大的GMP護駕 XDDGMP 好歹也是社區經營多年,測試結果數一數二的數學庫不過有好幾個測資確實無關lib,是rust比較慢

Links booklink

Contact Us: admin [ a t ] ucptt.com