Rust 比 C 更快吗?

最近 Reddit 上有人在問問題:在其他條件相同的情況下,什麼方法會讓 Rust 實現比 C 實現更快?我覺得這個問題很好,也很有趣!這個問題其實很難回答,因為它最終取決於「萬物皆同」的具體意義。
我覺得這也使得語言之間的比較變得困難。可以透過以下幾種方式來論證事物“相同”和“不同”,以及它們對運行時表現的影響。
Rust 語言內建了內嵌彙編。而 C 語言則將內聯彙編作為一種非常常見的編譯器擴展,以至於說它不是該語言的一部分都是一種有爭議的吹毛求疵。
來看看 Rust 語言中的一個程式碼範例:以下是一個函數rdtsc用來讀取時間戳,並傳回其值。以下是 C 語言的程式碼實作範例:

#include <stdint.h>
uint64_t rdtsc(void)
{    
 uint32_t lo, hi;
 __asm__ __volatile__ ( 
       "rdtsc"        
: "=a"(lo), "=d"(hi)
    );    
return ((uint64_t)hi << 32) | lo;}

以下是在 rustc1.87.0和 clang下20.1.0相同功能的程序:

rdtsc:        
      rdtsc        
      shl     rdx, 32        
      mov     eax, eax        
      or      rax, rdx        
      ret

以下是線上編譯網站 Godbolt 上的連結:
https://godbolt.org/z/f7K8cfnx7
這算嗎?我不知道。
我覺得這跟問題本身沒有太大關係,但至少是回答問題的一種方式。類似的程式碼,不同的結果
Rust 和 C 語言對於類似的程式碼可以有不同的語意。以下是 Rust 中的一個結構體

这是 C 语言中的“相同”结构:

struct C {    
          uint32_t x;    
          uint64_t y;    
          uint32_t z;
};

在 Rust 中,這個結構是 16 個位元組(同樣在 x86_64 上),而在 C 中,它是 24 個位元組。這是由於 Rust 可以自由地重新排序欄位以優化大小,而 C 語言則不能。
社會因素
有些人報告說,由於 Rust 的安全檢查機制,他們更願意編寫比同等 C(或 C++)更「危險」的程式碼,因為在 C(或 C++)中,他們會進行更多複製以確保程式碼更安全。

從同一個專案中的相同開發人員的角度來看,這似乎是“相同的”,但由於判斷調用,程式碼會有所不同。

很久以前有一個範例是 Stylo 專案。 Mozilla 曾經兩次嘗試用 C++ 並行化 Firefox 瀏覽器的樣式佈局,但兩次都失敗了。因為多執行緒處理太棘手,難以實現。第三次,他們使用了 Rust,並成功交付。這是同一個專案(雖然我認為不是同一個程式設計師),由同一個組織開發,但一次可行,一次則不行。

類似的問題也適用:假設我們有一個初級開發人員,他同時寫 Rust 和 C 語言來完成同一個任務。我們能否用其中一種語言寫出更快的程式碼呢?這個問題取決於他的能力水平,但與編寫同一份程式碼無關。這「一樣」嗎?我不知道。如果同一個任務交給兩種語言的專家,一個非常精通 Rust 但不了解 C 語言的人,反之亦然,會怎麼樣呢?這個與初級開發人員或「普通」開發人員有什麼區別?編譯時與執行時間?
另一位 Reddit 用戶在問題底部追問:我不是 Rust 專家,但大多數(全部?)安全檢查不是都是編譯時檢查嗎?它們應該不會對運行時產生任何影響。這也是好問題!這部分是另一個預設設定不同的例子。

例如,array[0]的這種聲明在兩種語言中都有效。 Rust 語言在執行時會進行邊界檢查。而 C 語言則沒有這種能力。在 Rust 中,我可以寫array.get_unchecked(0),並獲得 C 的語義。在 C 語言中,我需要編寫邊界檢查來獲得 Rust 的語義。在 Rust 中,如果編譯器能夠證明它是安全的,那麼檢查可能會被最佳化掉。在 C 語言中,如果我們手寫邊界檢查,如果編譯器能夠證明它是安全的,那麼檢查也可能被最佳化掉。 Rust 的許多安全檢查是在編譯時進行的,但也有一些工作是在執行時進行的。但這又引出了另一個有趣的問題:編譯時檢查可能會導致你為相同任務編寫與 C 語言不同的程式碼。一個常見的例子是使用索引而不是指針,這意味著產生的程式碼執行方式的不同。這種檢查真的是「在編譯時」進行嗎?從技術層面,在微觀層面,是這樣的。但在工程層面可能並非如此!結論
我認為這個問題最重要的部分與所謂的可能性有關,即:如果我們假設 C 是“最快的語言”,無論這意味著什麼;Rust 不能做同樣的事情,是否存在內部原因?
我認為答案是“否”,即使忽略內聯彙編的情況也是如此。所以在這個最重要的、最根本的層面上,答案是「兩者之間沒有差別」。但我們通常不會談論這些。我們通常會在工程的背景下討論某個事情,例如一個特定的項目,有特定的開發人員,有特定的時間限制等等。我認為這裡變數太多,很難得出普遍的結論。
作者:Steve Klabnik
编译:洛逸
原文:https://steveklabnik.com/writing/is-rust-faster-than-c