Rust:透過資料庫和物聯網應用程式進行效能和安全性分析
Rust 因其安全性和速度的結合而受到讚譽 [1],顯示出作為專業級語言的前景越來越大 [3, 8]。 然而,2021 年的調查 [3] 強調,儘管工作場所的使用率顯著上升(42% 至 59%),但行業採用率仍是主要關注點(38%)。 本研究透過將 Rust 在資料庫 (Redis) 和 IoT (ECHONET Lite) 兩個關鍵應用領域的實際實現與 C 和 Go 進行比較,直接解決了這個問題。
方法論:我們建立了兩個應用程序,鏡像 C 和 Go 中的規範,以評估 Rust 的效率和性能。 資料庫應用程式利用了 Redis [19],並與非官方的 Rust [21] 和 Go [23] 實作進行了比較。 IoT 應用程式涉及實作 ECHONET Lite 協定 [9],比較 C [11]、Go [13]、Rust [12] 和 Python [14] 實作。
評估一:資料庫應用(Redis)
此評估使用 redis-benchmark
在官方 C Redis 實作 [19]、Rust 子集 (mini-redis) [21] 和 Go 範例實作 (go-redis-server) 上測試 SET/GET 指令23]。 基準測試使用 50 個執行緒運行,每次運行迭代 10,000 次。 由於mini-redis的功能有限,評估僅關注效能,使用第99個百分位(p99)作為關鍵指標。
演出排名:C>去>鐵鏽
結果(如下圖所示)清楚地表明了 C 的卓越性能,大約比 Go 和 Rust 快三倍。 雖然 Go 和 Rust 實作都是子集,但差異突顯了潛在優化的領域。
Rust 效能分析:Rust 的 SET 和 GET 指令分別比 C 慢 28% 和 41%,並且比 Go 慢得多(分別慢 78% 和 88%)。這可能歸因於 mini-redis 使用的 Tokio 庫 [20] 的最佳化不完整。 此外,對 HashMap [17] 等標準函式庫元件的依賴可能會影響效能。
Go 效能分析:Go 的 go-redis 表現出奇的好,顯著超過 Rust 的效能,同時與 C 保持競爭力。 go-redis-server 實作的簡單性,僅依賴標準函式庫,顯示了進一步最佳化的潛力。
評估2:物聯網應用(ECHONET Lite)
此評估比較了 C、Go、Rust 和 Python 中 ECHONET Lite [9] 用戶端-伺服器實現的實現效率和效能。 這些實作共享一個共同的設計,但不同語言之間存在一些功能差異(見下圖)。
執行效率(LOC):Python > Rust ≈ Go > C
使用 Tokei [16] 進行程式碼行 (LOC) 分析揭示了 Python 的效率,緊隨其後的是 Rust 和 Go,其中 C 需要最多的程式碼。 (注意:自動產生的程式碼被排除在外。)
Rust 實作分析:Rust 的 LOC 計數與 Go 相當,反映了該語言固有的複雜性以及開發人員在編譯器及其嚴格語義方面面臨的挑戰 [5]。 處理特徵和生命週期的限制導致設計妥協。
C 實現分析:C 的高 LOC 數量源自於包含獨立的庫和包裝器以實現可移植性。
Go 實現分析:Go 的效率歸功於其簡單的實現和豐富的標準庫,允許直接翻譯 C 設計。
Python實作分析:Python的低LOC體現了該語言的靈活性和簡潔性。
表現排名:Go> C>生鏽>蟒蛇
效能是使用 time
指令測量的,執行 ECHONET Lite 控制器-物件互動的 10,000 次迭代。 Go 展現了卓越的效能,顯著超越了 C、Rust 和 Python。
Rust 效能分析:Rust 的效能落後於 Go 和 C,可能是由於 HashMap 和 Mutex 等標準函式庫元件的限制以及 UDPSocket 施加的限制。
C 效能分析:雖然 C 在使用者時間方面表現出色,但其係統時間明顯高於 Go 和 Rust,這表明了潛在的最佳化領域。
Go效能分析:Go的優越效能凸顯了其處理非同步UDP通訊的效率。
Python效能分析:Python的表現明顯低於其他語言。
結論
從「Better C」的角度來看,Go 成為了一個強而有力的繼承者,甚至有可能超越 Objective-C。 Rust 在提供安全性和速度的同時,也帶來了生產力、互通性和程式設計彈性方面的挑戰。 它的編譯器密集性質和利用現有資產的限制阻礙了它的採用。 Go 的執行效率和穩定的效能使其成為通用應用程式的可靠選擇。 有必要進一步調查 Rust、C 和 Go 中發現的效能瓶頸。
[1] - [27]:原文中提供的參考文獻。
以上是Rust、Go、C:資料庫和物聯網應用程式效能基準的詳細內容。更多資訊請關注PHP中文網其他相關文章!