[翻译] 比较 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 2419: 电阻 [高斯消元 物理]

    http://www.lydsy.com/JudgeOnline/problem.php?id=2419 题意: n个点m个电阻构成一张图,求1到n的等效电阻 第一节课看一道题弃疗,于是来做这道物理题 ...

  2. python+opencv2相机位姿估计

    最近在做基于图像的室内定位方面的研究,于是使用到了百度最新的室内数据库Image-based Localization (IBL) .由于该数据库给出的数据是每幅图像和其对应相机的内外参数和光心投影方 ...

  3. lxml etree的一个问题

    <div> <a href="xxxx">123</a> <a href="xxxx">45</a> ...

  4. S5PV210时钟,看门狗定时器

    晶振:时钟源(操作主要有两个,倍频,分频) A8的时钟源: 时钟域,每个时钟域(不同的最高频率和最低频率)管理着不同的电路模块: 不同的时钟域对应不同电路模块表 时钟电路:懂得看时钟电路(时钟源选择开 ...

  5. LeetCode - 657. Judge Route Circle

    Initially, there is a Robot at position (0, 0). Given a sequence of its moves, judge if this robot m ...

  6. 织梦autoindex应用 dedecms循环中判断第几条数据

    arclist 标签下使用 [field:global.autoindex/] 默认从1开始 {dede:arclist row='10' titlelen='48' typeid='1' chann ...

  7. 微信小程序(一)

    开发流程 注册微信小程序并申请微信支付-->制作小程序-->上传并提交审核-->审核通过,小程序上线   开发微信小程序需要准备 企业公众号(被认证)以及申请小程序.微信开发技术.S ...

  8. Java基础系列--集合之ArrayList

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8494618.html 一.概述 ArrayList是Java集合体系中最常使用,也是最简单 ...

  9. 《设计模式之禅》--设计模式大PK

    创建类模式包括工厂方法模式.建造者模式.抽象工厂模式.单例模式和原型模式. 其中单例模式要保持在内存中只有一个对象,原型模式是要求通过复制的方式产生一个新的对象. [工厂方法(抽象工厂) VS 建造者 ...

  10. tox环境安装

    ubuntu 下安装tox环境 1.apt-get install pip 2.pip install tox 3.git git clone https://github.com/openstack ...