原文: [Comparing AWS Lambda performance of Node.js, Python, Java, C# and Go](https://read.acloud.guru/comparing-aws-lambda-performance-of-node-js-python... ...
[翻譯] 比較 Node.js,Python,Java,C# 和 Go 的 AWS Lambda 性能
原文: Comparing AWS Lambda performance of Node.js, Python, Java, C# and Go
AWS 最近宣佈他們支持了 C# (Net Core 2.0 版本) 和 Go 語言來實現 Lambda 功能。
(譯者註: AWS Lambda 是 AWS 推出的 Serverless 功能,請參閱這裡或 Serverless 相關資料)
做為一名維護 serverless-golang 項目的工程師,我很想知道每個語言運行時的性能如何,尤其是與其他開發者就此主題深入討論之後。
(譯者註:上圖是 github 上的討論:性能優化是 Lambda 接下來工作會一直持續的事情。每種語言都有他們的長處和弱點, 這就是為什麼我們會有這樣有趣的語言戰爭 :) 此測試只是測量語言運行時啟動時間, 這是動態語言例如 Node.js 和 Python 速度比 C# 和 Java 這樣的靜態語言快的原因, 因為它們缺少類型檢查和依賴項的惰性載入。)
為了找到答案,我使用 Serverless 框架 開發了一系列性能測試,並觀察出了一些非常有趣的結果。
2018 AWS Lambda 性能測試
我的性能測試基於 Yan Cui 2017 年進行的 AWS Lambda 函數的性能測試和比較。為了保持一致性,我 fork 了 Yan 的代碼庫並添加了一些額外的測試模板。
與 Yan 的原始性能測試類似,我們將忽略初始冷啟動時間,僅關註持續時間這一標準,以比較不同語言之間的運行時性能。
所有用於測試的代碼都可以在我的 GitHub 倉庫 中找到。
每個 Lambda 函數都配置了由 Serverless 框架設置的預設 1024MB 記憶體, 並部署到了北弗吉尼亞州(us-east-1)。部署時總共有 12 個 Lambda 函數。
為了管理性能負載測試, 我創建了一個叫 artillery.io 做的腳本。該腳本在一個小時內對所有 12 個 API 執行負載測試:
觀察結果 1 - Net Core 2.0 擁有顯著的提高
.Net Core 2.0 上的 C# 和 F# 都超出了全部預期,並且在平均持續時間內勝過了所有其他運行時。 AWS Lambda 用戶應該將 .Net Core 2.0 設為預設設置,並升級所有仍在使用 1.0 的項目。
請觀察圖上的平均持續時間,.Net Core 2.0 上的 C# 和 F# 在整個 1 小時內始終低於其他運行時:
.Net Core 2.0 上 C# 的平均持續時間
觀察結果 2 — Go 的性能與 Java 相當
Go 的運行時性能與 Java 非常相似。使用 UPX 壓縮或 Python Shim 沒有顯著的性能提升。
在1小時內,Go 的平均持續時間與 Java 完全相同:
Go 1.x的平均持續時間
觀察結果 3 — 編譯語言與動態語言的性能穩定性
在原來的 2017 年基準測試結果中,與動態語言例如 Python 和 Node.js 相比,Java 和 .Net Core 1.0 這類編譯語言的性能顯然更加穩定。
基於最新的 2018 年性能測試結果,我們觀察到 Java 和新的編譯語言(.Net Core 2.0 和 Go)以及原始動態語言之間沒有太大差異。
性能穩定性,比較平均和最大持續時間
在 2018 年的結果中,我們在所有語言中觀察到了更多的穩定性。可以大膽的推測, 雖然新語言正在添加到 AWS Lambda 中, 但現有的語言不會被遺忘, 而且正在不斷地改進。
觀察結果 4 — Go 的包體積比 Java 大
使用 -s
和 -w
鏈接器 flag 進行編譯的 Go 二進位文件(2.3mb)會比 Java(2.0mb)體積更大(2.3mb)。通過使用 upx,可以縮小二進位大小,但沒有顯著的改善。
C# 在所有編譯語言中占用的空間最小是 201KB,而 F# 增加了大約 1MB 的額外依賴。
最後的想法
藉助對 Go 和 .Net Core 2.0 支持,AWS 繼續領導了 FaaS 和 Furious 競賽,成為最成熟的提供商,擁有了最廣泛的支持語言。我很高興看到 AWS Lambda 的 .Net Core 2.0 工具的性能和穩定性從早期的 1.0 版本有所改進。
作為 Go 編程語言的倡導者,我仍然覺得 Go 運行時需要一些優化工作。根據性能測試的結果,.Net Core 2.0 比 Go 的執行速度高了 3 倍。
我猜測 .Net Core 2.0 超越 Go 的性能優勢是由於在容器級別進行了一些特定的底層優化以及潛在的 JSON 序列化優化或緩存。雖然對結果感到失望,但我相信隨著 AWS Lambda 平臺持續的快速發展,Go 的性能將會提高。
本性能測試不反映真實的生產用例,最終性能差異非常微妙。然而,與去年相比,架構師和工程師在2018 年考慮 AWS Lambda 功能時應該從所有可用的語言運行時中進行選擇。
讓我在下麵的評論中瞭解你的想法,或直接通過Twitter @yunzhilin與我聯繫。
本文作者 Yun 是 Contino 亞太地區的副總裁,Contino是一家全球咨詢公司,通過現代化的軟體交付使公司組織加速創新。