[翻译] 比较 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. [快速傅立叶变换&快速傅里叶变换]【旧 手写笔记】

    $FFT$好美啊 参考资料: 1.算法导论 2.Miskcoo 3.Menci 4.虚数的意义-阮一峰 简单说一下,具体在下面的图片 实现: 可以用$complex$也可以手写 和计算几何差不多 注意 ...

  2. Vue打包后出现一些map文件

    Vue打包后出现一些map文件的解决办法: 问题: 可能很多人在做vue项目打包,打包之后js中,会自动生成一些map文件,那我们怎么把它去掉不要呢? 1,运行  cnpm run build  开始 ...

  3. C#开发短信发送

    //需要用到的命名空间 using System.Net;using System.IO;using System.Text;//调用时只需要把拼成的URL传给该函数即可.判断返回值即可public ...

  4. jQuery源码研究——解决命名冲突

    在项目中难免不去使用多个插件,如此一来这些插件就有可能出现一样的名称,当出现同名变量时后一个将会覆盖上一个,这样的话我们就无法同时使用多个插件了. 当遇到这种情况我们可以手动去修改插件源码把它的名字改 ...

  5. JS原型学习之旅(一)之一图了解原型链关系

    目前正在学JS的原型思想(准确的说是从昨天2018.1.29开始正式接触),琢磨了两天,在chrome的console不停的敲了好多代码测试__proto__和prototype的关系,有了些小收获( ...

  6. iOS实现微信外部H5支付完成后返回原APP

    看到微信最近放开了微信H5支付,公司决定把H5集成到多款APP上.下面记录下了开发过程. 由于是微信新推出的支付方式,在网上搜索到的相关资料并不多,其中有一篇文件(点此跳转)对我的整个开发过程起到了很 ...

  7. 阿里云Aliyun_server

    一.云概念 云主机是基于云计算平台的一种虚拟的主机服务器产品 云服务器(99.999%安全性,扩展性) 特点: 1.资源分配配置灵活,安全性能强. 2.优于VPS和独立服务器产品.通俗的理解: 云主机 ...

  8. 手把手教你用.NET Core写爬虫

    写在前面 自从上一个项目58HouseSearch从.NET迁移到.NET core之后,磕磕碰碰磨蹭了一个月才正式上线到新版本. 然后最近又开了个新坑,搞了个Dy2018Crawler用来爬dy20 ...

  9. Angular4.0用命令行创建组件服务出错

    之前使用cnpm创建的angular4.0项目,由于cnpm下载的node_modules资源经常会有部分缺失,所以在用命令行创建模板.服务的时候会报错: Error: ELOOP: too many ...

  10. 老男孩Python全栈开发(92天全)视频教程 自学笔记09

    day9课程内容: 乌班图(ubuntu)64位系统 和 VMware 虚拟机安装(官网收费又麻烦,在网上找资源 安装vmware: vm运行(秘钥找度娘)--文件--新建虚拟机--自定义 下一步-- ...