顶级服务器端Swift框架与Node.js的更新基准测试

方法

自上次以来的变化

上一次基准测试的最大变化是,就像第一次一样,我已经切换回了macOS。 Vapor对Vapor 2.0进行了非常深入和详细的重写,我还通过触摸条将笔记本电脑升级到了2016年底的rMBP。 由于我从未遇到过产生足以进行测试的负载的问题,因此这对结果的影响应该很小。

基准测试

在每个框架的相同软件设计上执行了两个基准测试。 第一个是博客页面的表示形式,第二个是JSON数据。 它们被设计为尽可能地彼此接近,同时仍以每个框架的独特语法和样式进行本地编码。 这些旨在代表您可能会使用服务器端实现的真实场景。 它们足够复杂,不仅可以在屏幕上打印“ Hello,World!”,而且还足够有效。

源代码

与往常一样,所有这些都是通过公开的开放源代码完成的。 如果您想通读代码以了解它们是如何组合在一起的,请查看自上一篇文章以来所做的改进,或者在您自己的环境配置中重复测试,您可以在此处找到完整的源代码:

https://github.com/rymcol/Server-Side-Swift-Benchmarks-Summer-2017

笔记

有几件事需要澄清和注意:

  • Kitura和Zewo在过去的建筑物中都存在绝对文件路径中带有空格的问题。 我没有重新测试以查看是否仍然存在,只是在文件路径中没有使用任何空格。
  • 每个框架现在都视为发行版(而非Beta版),这部分是为什么我尚未在Swift 4上进行测试的部分原因。
  • Zewo是单线程的,旨在以并行配置运行,这意味着计算机上的每个逻辑处理器ID都在运行一个进程。 同样,Node旨在使用群集在多个实例上运行以实现最佳性能,并且已实现。 Perfect,Vapor和Kitura是线程化的,它们管理自己的线程。
  • 所有四个Swift框架均在发布模式下的3.1发布工具链上进行了编译。 节点无法编译。
  • Node.js包含在当前的稳定发行版中
  • 如果删除任何给定框架的绒毛(功能集),而仅使用骨骼,则可能会得到更快的结果。 这次我没有做任何事情,因为我想在每个框架中进行开发,因为它已经展示出来,并且遇到它的大多数开发人员将如何使用它。
  • 从Vapor 2开始,Vapor不再是纯粹的Swift,至少包括chttp和LibreSSL / OpenSSL。
  • Vapor具有用于运行发行版的特殊语法。 如果仅执行二进制文件,则将获得一些额外的控制台日志记录,这些日志记录将有助于开发和调试过程。 那有一点点开销。 要以发布模式运行Vapor,您需要添加:
  --env =生产 

到可执行文件。 即

  .build / release / Run --env = production 

为什么选择Node.js / Express?

我决定将Swift与Node.js中的Express框架抗衡。 它显示了与广泛使用的语言和框架相比,Swift可以给人留下深刻的印象,而且它们都具有非常相似的样式和语法。

发展历程

所有博客均取自上一个存储库,并已更新为每个框架的当前版本。

托管与环境

为了最大程度地减少环境中的差异,我采用了上次用于macOS基准测试的2012 Mac Mini,对其进行了格式化,并对其进行了全新的macOS安装。 之后,我下载并安装了Swift 3.1(Xcode)的发行版。 从那里,我克隆了存储库,并以发布模式干净地构建了每个博客,并添加了它们所需要的所有缺少的依赖项(当然,它们对我大吼大叫)。 我还安装了Node.js v8.1.2(测试时最新,稳定的版本)。 我从来没有一次跑过一个,并且在测试之间每个都停止并重新启动。 测试服务器规格为:

为了进行开发,我使用了15英寸2016 rMBP TouchBar。这是我最新的现实生活开发机器。我使用wrk来获取基准,并通过雷电3比2适配器进行了此操作。Wifi和所有其他网络均已关闭在两台机器上都进行了测试,并在Thunderbolt桥上进行了测试,以最大程度地减少网络和带宽限制可能产生的影响;在Thunderbolt 3到Adapter和Apple的Thunderbolt电缆之外未使用任何网络硬件。一台机器,并使用一台功能更强大的单独机器来产生负载,从而确保您能够胜任服务器的能力,这也为您提供了一致的测试环境,因此,我可以说每个博客都在相同的硬件上运行,并且同样的条件。出于好奇,我的机器规格是:

标杆管理

为了进行基准测试,我使用了十分钟的测试,测试了四个线程,每个线程包含20个连接。 四秒未测试。 十分钟是获取大量数据的合理时间范围,并且在四个线程上运行20个连接对于博客来说是一个不错的负载,而且不会破坏任何内容。 您可以使用以下方法实现相同的目的:

  wrk -d 10m -t 4 -c 20 http:// ip-address:8X8X / blog 

其中“ ip-address”是您需要连接到的计算机地址,8x8x是使用的端口,/ blog或/ json用于对所需版本进行基准测试。

博客基准测试结果

第一个基准是每个中的/ blog路由,这是一个页面,该页面针对每个请求返回5个随机图像和虚假博客帖子。

跑了什么

  wrk -d 10m -t 4 -c 20 http:// ip-address:(PORT)/ blog 

是通过Thunderbolt网桥为我的笔记本电脑到测试的Mac Mini服务器上的每个博客运行的。

运行方式

每个框架都以发布模式运行,并且在每次测试之前已停止并重新启动。 在任何给定时间,服务器上仅运行一个框架。 在测试过程中,两台计算机上的所有活动均应最少,以保持环境尽可能清洁和一致。

结果

JSON基准结果

第二个基准是每个框架中的/ json路由,这是一个返回10个随机数的JSON字典的页面。

跑了什么

  wrk -d 10m -t 4 -c 20 http:// ip-address:(PORT)/ json 

在相同的Thunderbolt桥设置上再次为每个JSON项目运行。

运行方式

与其他测试一样,每个框架都尽可能在发布模式下运行,并在每次测试之前停止并重新启动。 在任何给定时间,服务器上仅运行一个框架。 在测试过程中,两台计算机上的所有活动都应最少,以保持环境尽可能相似。

结果

Interesting Posts