[翻译] 比较 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 1037: [ZJOI2008]生日聚会Party [序列DP]

    1037: [ZJOI2008]生日聚会Party Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2249  Solved: 1337[Submit] ...

  2. 学习docker on windows (1): 为什么要使用docker

    为什么要用Docker? 如果我们想使用某种pc软件, 那么在互联网上查找并安装软件的流程大致如下图: 那么这就有几个问题要弄清楚: 从哪里获得软件 App Store Linux的包管理 从某些网站 ...

  3. mac攻略(2) -- apache站点配置

    [http://www.cnblogs.com/redirect/p/6112164.html] Mac OS X 中默认有两个目录可以直接运行你的 Web 程序, 一个是系统级的 Web 根目录:/ ...

  4. python学习:备份文档并压缩为zip格式

    import os import time source = ['/root/notes'] target_dir = '/root/backup' if not os.path.exists(tar ...

  5. 在一台电脑上运行两个或两个以上的tomcat

    前言 在开发过程中,我们可能会同时用到多个tomcat,但以正常安装的形式安装多个tomcat,无论启动哪一个tomcat,打开的都是配置了环境变量的那一个tomcat,所以进行一些设置,以达到我们同 ...

  6. 【linux之find及awk】

    一.find命令 find 精确查找,根据提供的条件或组合条件进行查找,遍历所有文件,因此速度比较慢. 语法: find 目录 条件 动作 默认目录是当前目录默认条件是所有条件默认动作是显示查找到的信 ...

  7. 从零开始学习前端JAVASCRIPT — 11、Ajax-前后端异步交互以及Promise-异步编程的改进

    (注:本章讲解涉及部分后端知识,将以php提供数据的方式进行相应的demo实现) 1:ajax的概念 全称:Asynchronous Javascript And Xml AJAX不是一种新的编程语言 ...

  8. MySQL的BlackHole引擎在主从架构中的作用

    MySQL在5.x系列提供了Blackhole引擎–“黑洞”. 其作用正如其名字一样:任何写入到此引擎的数据均会被丢弃掉, 不做实际存储:Select语句的内容永远是空. 和Linux中的 /dev/ ...

  9. Egret学习笔记 (Egret打飞机-9.子弹对敌机和主角的碰撞)

    运行起来,虽然主角飞机和敌机都在互相发射子弹,但是子弹打中了就和没打中效果是一样的.. 这一章我们就来处理子弹和飞机的碰撞问题. 我们所有的操作都是基于Main这个容器来做的.所以我就把这个处理放到M ...

  10. Android Stdio 如何自定义生成APK的名称

    Android Stdio自动默认生成的app的名称都是app-release或者app-debug,生成完后还要手动更改apk的名称,很是麻烦. 自定义生成APK的名称的方法:在\app\build ...