C_and_CPP 板


LINE

※ 引述《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 還是比較適合的選擇 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.227.5.133
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1502645537.A.264.html
1F:推 FRAXIS: C 的 qsort 比 C++ 的 std::sort 慢是差在 template? 08/14 06:05
2F:推 LPH66: 可能是; C++ 有 template 所以可以 inline 比較函式 08/14 07:49
3F:→ LPH66: 但 qsort 一定是(間接)呼叫 08/14 07:49
4F:→ LPH66: 我沒實測過所以這只是推測就是了 08/14 07:50
5F:→ fatrabitree: std::sort不是單純quick sort 08/14 08:49
6F:→ Sidney0503: quick sort到一半改用heap sort 這是現在最快的 08/14 10:31
7F:→ Sidney0503: 純比較排序法 08/14 10:31
8F:推 johnlinvc: std:sort 用的是 intro sort 08/14 11:31
9F:→ freeunixer: 以前都苦幹幾個以下用哪種,幾個以上用哪種,多少要拆. 08/14 11:57
10F:→ tinlans: SGI STL 的 std::sort 不是 quick sort 08/14 15:28
11F:推 LPH66: 喔對, 忘了它是 intro sort... 08/15 00:01
12F:推 os653: 感謝說明,其實我也很好奇為啥在C的部分會看到omp的東西 08/16 22:27
13F:→ os653: 想說比速度不是應該用同條件去比才對嗎? 08/16 22:27
14F:→ os653: 照您的說法就說得通了 08/16 22:29
15F:推 firejox: 不同的lib的std::sort 實作都不太一樣,clang的好像是5p 08/19 10:47
16F:→ firejox: ivot的quick sort 08/19 10:47







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Gossiping站內搜尋

TOP