[翻译] 比较 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是一家全球咨询公司,通过现代化的软件交付使公司组织加速创新。

[翻译] 比较 Node.js,Python,Java,C# 和 Go 的 AWS Lambda 性能的更多相关文章

  1. node.js 与java 的主要的区别是什么

    node.js 与java都是服务器语言,但是两者存在很大区别:(1)Node.js比Java更快 :node.js开发快,运行的效率也算比较高,但是如果项目大了就容易乱,而且javascript不是 ...

  2. [Python+Java双语版自动化测试(接口测试+Web+App+性能+CICD)

    [Python+Java双语版自动化测试(接口测试+Web+App+性能+CICD)开学典礼](https://ke.qq.com/course/453802)**测试交流群:549376944**0 ...

  3. 自我理解node.js相比java的优势

    今天学习node.js,相比于之前学习过的java,node.js有一些优越之处.原因是它是一个基于Chrome v8引擎建立的JavaScript运行平台. (1)创建服务器:自行服务器来监听客户端 ...

  4. Node.js/Python爬取网上漫画

    某个周日晚上偶然发现了<火星异种>这部漫画,便在网上在线看了起来.在看的过程中图片加载很慢,而且有时候还不小心点到广告,大大延缓了我看的进度.后来想到能不能把先把漫画全部抓取到本地再去看. ...

  5. Node.js / Python 日志

    一.Node.js 日志 1.原生 Node.js 原生方法其实很简单,就四个: // 输出到 stdout console.log() console.info() = console.log() ...

  6. (翻译)《Hands-on Node.js》—— Introduction

    今天开始会和大熊君{{bb}}一起着手翻译node的系列外文书籍,大熊负责翻译<Node.js IN ACTION>一书,而我暂时负责翻译这本<Hands-on Node.js> ...

  7. PHP, Python, Node.js 哪个比较适合写爬虫?

    PHP, Python, Node.js 哪个比较适合写爬虫? 1.对页面的解析能力2.对数据库的操作能力(mysql)3.爬取效率4.代码量推荐语言时说明所需类库或者框架,谢谢.比如:python+ ...

  8. PayPal为什么从Java迁移到Node.js

    前言 大家都知道PayPal是另一家迁移到Node.js平台的大型公司,Jeff Harrell的这篇博文 Node.js at PayPal  解释了为什么从Java迁移出来的原因: 开发效率提高一 ...

  9. 实战系列之 Node.js 玩转 Java

    这些年以来,Node.js的兴起,JavaScript已经从当年的“世界最被误解的语言”变成了“世界最流行的语言”.且其发展之势,从语言本身的进化,库和包的增长,工具支持的完善,star项目和领域解决 ...

随机推荐

  1. BZOJ 3771: Triple [快速傅里叶变换 生成函数 容斥原理]

    题意:n个物品,可以用1/2/3个不同的物品组成不同的价值,求每种价值有多少种方案(顺序不同算一种) [生成函数]: 构造这么一个多项式函数g(x),使得n次项系数为a[n]. 普通型生成函数用于解决 ...

  2. POJ1743 Musical Theme [后缀自动机]

    题意:不重叠最长重复子串 后缀数组做法:http://www.cnblogs.com/candy99/p/6227659.html 后缀自动机的话,首先|Right|>=2 然后min(t[u] ...

  3. .NET方面的框架的整理和总结

    自从学习.NET以来,优雅的编程风格,极度简单的可扩展性,足够强大开发工具,极小的学习曲线,让我对这个平台产生了浓厚的兴趣,在工作和学习中也积累了一些开源的组件,就目前想到的先整理于此,如果再想到,就 ...

  4. php.ini 中文详解

    [PHP]  ; PHP还是一个不断发展的工具,其功能还在不断地删减  ; 而php.ini的设置更改可以反映出相当的变化,  ; 在使用新的PHP版本前,研究一下php.ini会有好处的   ;;; ...

  5. [Swift]UIKit学习之警告框:UIAlertController和UIAlertView

    Important: UIAlertView is deprecated in iOS 8. (Note that UIAlertViewDelegate is also deprecated.) T ...

  6. CEF小白人系列1-认识CEF

    手头上有个项目需要做浏览器的相关功能,评估了几个嵌入式方案最后选定CEF作为开发基础. 在入坑新技术的时候第一选择是去官网学习,这是一个非常好的习惯. CEF官网(请科学上网) https://bit ...

  7. 《InsideUE4》UObject(六)类型系统代码生成重构-UE4CodeGen_Private

    读的不如写的快 引言 在之前的<InsideUE4>UObject(四)类型系统代码生成和<InsideUE4>UObject(五)类型系统收集章节里,我们介绍了UE4是如何根 ...

  8. HashMap原理阅读

    前言 还是需要从头阅读下HashMap的源码.目标在于更好的理解HashMap的用法,学习更精炼的编码规范,以及应对面试. 它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而 ...

  9. cryptojs的使用

    项目中经常会遇到加密解密的需求,这里有一个js库非常好用,就是crypto-js.下面记录一下使用方法. 首先,安装js库 npm install crypto-js --save 然后,在项目中使用 ...

  10. LOJ6277~6285 数列分块入门

    Portals 分块需注意的问题 数组大小应为,因为最后一个块可能会超出的范围. 当操作的区间在一个块内时,要特判成暴力修改. 要清楚什么时候应该+tag[t] 数列分块入门 1 给出一个长为的数列, ...