编程语言API性能大比拼

Ciaran是Skimlinks项目团队中的一名领导者,热爱开发,在业余时间喜欢研究一门新语言。作者和他的团队在开发Skimlinks项目时遇到了一些困难,于是做了这份测试,文中将Node.js、Scala、Go、Python、PHP进行对比,最终Python获胜,目的的是为了让开发者为stack挑选最好的开发技术。

在过去的这段时间里,我之所以杳无音讯,是因为作为这个项目的领头人,我正从事一项有趣的项目,我们将其命名为“Skimlinks”。

我的大部分工作是从事后端引擎开发和支持SkimWords产品进程,通过一些非常完美的高科技进行识别和添加代销商网络产品链接从而让网站主获取利润。这是一种新颖的线上广告模式,相比于页面上的大幅banners图我更喜欢这种新颖的模式,我们正在尝试为用户添加有价值的信息如产品价格比较、添加链接让用户可直接购买想要的产品。

开发环境:

大部分前端开发是用PHP编写的,当公司需要快速、灵活开发项目时,选择PHP是个不错的选择。但是随着公司既定产品的知名度不断提高以及搜索的高并发访量,PHP正日益成为我们发展的一个瓶颈。

存在问题:

使用Apache多选程模块(MPM),apache会阻碍大量的搜索请求,当出现高并发访量时,页面无法响应。

这里有一个快速的方法可提高服务器的吞吐量增加工作进程,然而当RAM快要耗尽时,将会受到限制。每个进程都有独立的RAM数据块,增长和搜索取决于PHP在哪个点上,当没有足够的空间释放时,你必须将OOMing关闭(它可以迅速的将吞吐量降至为0)。

最可行的扩大规模的方法就是把项目管理模块从Apache prefork MPM换成更出色、更快速的Apache worker MPM。通过改变多进程大大增加了服务器请求数,唯一的缺陷只是为了这个工作而工作,PHP必须能够保证处理多个并发线程不会产生死机,然而事实并非如此。PHP的核心是多线程,因此我门认为它可能是因为某些驱动或者延长使用而导致失败,然而无论出于什么原因,PHP不在符合我们的需求。

为此,引发了我们会选择哪种语言进行开发而争论不休,每个人都在推崇他们喜欢的语言,有人赞成、有人反对。很明显,众口难调,没有一个衡量标准是很难选出来的,因此,我们决定用各个语言来测试一个系统,看它们的执行情况在做定夺。

参赛语言:

基本规则是,如果你想要某语言进行测试必须愿意提供执行API请求数,最后推选出:

  • Node.js:流行程度依然高涨,它的目标是帮助程序员构建高度可伸缩的应用程序,编写能够处理数万条同时连接到一个(只有一个)物理机的连接代码。 
  • Scala (w/ Tomcat):我非常热爱JVM,起初我也推荐过该语言,但因为它过于冗长而被否决,令人兴奋的是,这次Scala得到了大家的认可。
  • Python (w/ Tornado):我们已经有Python方面的经验。
  • Go (golang):我对这门语言感兴趣,而我的同伴们却认为这门语言不好,建议使用Java。我还建议使用C#和.NET/mono,但因为不公平性,最后都被否定了。

挑战:

我们选择了一个非常简单的日志API系统,所做的这些是为了从JSON请求数中抓取详细信息,采用MD5,用于确保信息传输完整一致。(主流编程语言普遍都用MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理)每个执行阶段都将使用Apache Benchmark(Apache附带的一个小工具,专门用于HTTP Server的benchmark testing,可以同时模拟多个并发请求)来评估各种语言开发并发水平速度。

当Node.js和Python Tornado以单一线程运行时,使用Nginx(一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器 )来查看这两个实例。

针对Scala我甚至特意编写一份old-school Servlet(一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面,它担当客户请求Web浏览器或其他HTTP客户程序与服务器响应的中间层)在基于tomcat下运行。

采用AWS(Asp Web Server是一款基于netbox开发的asp web服务器,其个小功能强大,基本上能够取代IIS成为广大Asp程序员和网站开发者的利器)直接在服务器上执行基准,以消除任何一个网络瓶颈。

通过mongo删除每次测试数据,每次测试至少执行3次,选取平均值,以确保有足够的“热身”时间和消除任何异常结果。

通过在多个并发值下进行测试((10,50,100,200,500,1000),一起来看下在高负荷的情况下,性能发生了什么变化。

测试结果:

每秒请求数:这个测试给了我们一个实现纯速度的想法,最明显的一点(越高越好)。

有一点值得我很欣慰,Scala独占鳌头。PHP(正如预期所想的那样)受多线程的限制,香消玉损。另一个让我震撼的是Go语言当并发访量不断增加时,它以平缓的速度迅速下滑,最终也Over了。如期所料,两个单线程non-blocking solutions(node和 python)性能差不多,python要比Node稍微好点。

响应时间:

尽管每秒请求数进程的吞吐量呈现出一个好的迹象,但是同样重要的是在高负荷的情况下,表现很糟糕。由图表得知,在一段时间内完成的请求数比例,越低越好。

100并发请求数:

在这里,我们看到Scala需要的时间最少,而其他几门语言之间没有太大区别。

200并发请求数:

图中,我们看到有趣的现象,以9秒速度来计算请求数,Go和PHP都有受到影响,花费的时间比较多。

500并发请求数:

在500并发需求时,使用9—14秒完成请求。PHP无法响应,Go语言花费时间较多,占最高值。

1000并发需求数:

当我们遇到数以千计的请求数时, Go语言Over了,通过测试,根据apache规则要求超过50%的失败率就算出局。如图所示Node和Python依然存在,可以清楚的看到其性能特性。但是Python比Node要更好一点。但在第一幅图上,Python表现的要稍微差一点。

通过测试,能清楚的分辨出各语言的性能表现,以上测试的这些数据是我们APIs中的一部分,因此对我们来说非常重要。

Scala表现的很好,几乎很完美,我把它归功于在连接池的Mongo数据库中单独接入MessageDigests和快速进行JSON分析程序。我不确定Go语言到底是怎么了,也许是我使用的Mongo驱动的问题,但无论是什么原因,看到它这么差的表现真的让我很难过。

最后决定:

最终,我们经过讨论决定选择Python!Scala如此之快,我们为什么不选择Scala而另选Python呢?原因如下:

Scala这门语言很难,我需要很久才能将简单的API整合在一起,才能进行工作,python阅读起来就像haiku,而Scala阅读就像蛇类游戏一样。

线性编程是很痛苦的,对Scala来说,很容易也很安全,简单的单线程non-blocking解决方案总是很吸引人,但我们应该不断的去尝试挑战。

整个团队在Python上有着丰富的经验,如果让大家去接受一门新的语言,尤其像Scala这样的既昂贵又费时间。

此前网络速度、数据库查询等API成为我们发展的一个瓶颈,而今,我们已经找到正确的解决方案——Python,我们只需等待执行和发布,希望这个决定是正确的。

英文出自:skimlinks


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu 安装ssh服务

1:安装 $ sudo apt-get install openssh-server 2:检查ssh服务开启状态 $ ps -s | grep ssh 3:启动ssh服务 $ service ssh start 4:本地登录 $ ssh localhost转载于:https://www.cnblogs.com/andy1327/p/9089930.html

手把手0基础项目实战(一)——教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)...

本文你将学到什么? 本文将以原理实战的方式,首先对“微服务”相关的概念进行知识点扫盲,然后开始手把手教你搭建这一整套的微服务系统。 项目完整源码下载 https://github.com/bz51/SpringBoot-Dubbo-Docker-Jenkins 这套微服务框架能干啥&am…

C语言中临时变量写在哪里,C语言中不允许创建临时变量,交换两个数的内容

在C语言中可以通过建立临时变量来实现两个变量的交换,当不允许建立临时变量时,应该怎样实现两变量的交换呢?假设有两个变量num1和num2;下面通过两种方法进行分析。方法一:利用加减法。具体算法分析如下:由于…

Python面试题总结(8)--操作类

1. 请写一个 Python 逻辑,计算一个文件中的大写字母数量 答:读取‘A.txt’中的大写字母数量 with open(A.txt) as f:"""计算一个文件中的大写字母数量"""count 0for i in f.read():if i.isupper():count 1 print(cou…

联合主键

一个数据库表只能有一个主键,不允许两个主键。但是允许两个字段联合起来设置为主键,这叫联合主键。

node之post提交上传

post文件上传 multer 中间件 在node中 express为了性能考虑采用按需加载的方式,引入各种中间件来完成需求, 平时解析post上传数据时候,是用body-parse。但这个中间件有缺点,只能解析post的文本内容,(applic…

要有自己的核心竞争力,应对时代变迁

在之前的PC时代和互联网时代,人们都有一些顾虑,觉得智能化新技术的到来和采用将会导致就业人数急剧减少。 但实际上,无论是PC还是互联网这样新技术的到来,其实都对就业有极大的促进作用,其中最明显的例子,…

ul、li列表简单实用代码实例

利用ul和li可以实现列表效果&#xff0c;下面就是一个简单的演示。 代码如下: 010203040506070809101112131415161718192021222324252627282930313233<!DOCTYPE html><html> <head> <meta charset" utf-8"> <meta name"author"…

Flask--读取配置参数的方式

文章目录方法1. 使用配置文件方法2. 使用对象配置参数方法3. 直接操作config的字典对象项目实例方法1. 使用配置文件 首先将配置参数写在文件中&#xff0c;例如&#xff1a;config.cfg 然后导入: app Flask("__name__") app.config.from_pyfile("config.cf…

g开头的C语言编程软件,C语言函数大全(g开头)

函数名: gcvt功 能: 把浮点数转换成字符串用 法: char *gcvt(double value, int ndigit, char *buf);程序例:#include#includeint main(void){char str[25];double num;int sig 5; /* significant digits *//* a regular number */num 9.876;gcvt(num, sig, str);printf(&quo…

什么是总体设计

总体设计的基本目的就是回答“概括地说&#xff0c;系统应该如何实现”这个问题&#xff0c;因此&#xff0c;总体设计又称为概要设计或初步设计。总体设计阶段的另一项重要任务是设计软件的结构&#xff0c;也就是要确定系统中每个程序是由哪些模块组成的&#xff0c;以及这些…

程序员成熟的标志《程序员成长路线图:从入门到优秀》

对好书进行整理&#xff0c;把好内容共享。 我见证过许多的程序员的成长&#xff0c;他们很多人在进入成熟期之后&#xff0c;技术上相对较高&#xff0c;一般项目开发起来比较自信&#xff0c;没有什么太大的困难&#xff0c;有的职位上也有所提升&#xff0c;成了项目经理、…

Diango博客--1.Django的接客之道

文章目录0.思路引导1.实现最简单的HelloWorld2.实现最简单的HelloWorld(使用Templates)0.思路引导 django 的开发流程&#xff1a; 即首先配置 URL&#xff0c;把 URL 和相应的视图函数绑定&#xff0c;一般写在 urls.py 文件里&#xff0c;然后在工程的 urls.py 文件引入。 …

c语言is int number,C语言中NSInteger,NSNumber以及Int的区别

NSInteger和NSNumber首先:NSInteger,NSNumber并没有什么关系,更不要想当然的以为二者还有什么继承关系,甚至还有人问NSInteger是不是NSNumber的子类?答案当然是NO!!!NSInteger只是一个基本的数据类型,而NSNumber是OC的对象,并且NSNumber继承自NSValue,NSValue又继承自NSObject…

Git的GUI工具sourcetree的使用

一、Git的学习这部分学习廖雪峰的git教程&#xff0c;参加以下链接&#xff1a;https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b0001、首先是git的基本概念&#xff0c;如下图所示&#xff1a;整个git管理主要分为工作区、版本库&#xff0…

YY一下,扎克伯格做了一个什么样的AI家居助手?

对于这款令小扎太太抓狂的AI家居助手&#xff0c;难道就没人好奇吗&#xff1f; 据说&#xff0c;扎克伯格每年都要给自己定个目标&#xff0c;而他也即将完成今年的目标——打造一个AI家居助手。 当初&#xff0c;在定下这个目标时&#xff0c;小扎为我们简单描述了一下&…

Diango博客--2.博客从“裸奔”到“有皮肤”

文章目录0.思路引导1.更改视图函数&#xff0c;从数据库中获取数据2.网上下载模板&#xff0c;添加静态文件3.修改模板Templates中css、js文件的加载路径4.修改模板&#xff0c;引入模板变量&#xff0c;获取数据库数据0.思路引导 前文的Hello World 级别的视图函数特别简单&a…

抽象

人类在认识复杂现象的过程中使用的最强有力的思维工具是抽象。人们在实践中认识到&#xff0c;在现实世界中一定事物、状态或过程之间总存在着某些相似的方面(共性)。把这些相似的方面集中和概括起来&#xff0c;暂时忽略它们之间的差异&#xff0c;这就是抽象。或者说抽象就是…

程序员的成长从开窍开始系列 一、如何摆脱低级错误的困扰

最近&#xff0c;有两位Google Maps API的初学者向我请教他们按照最简单例子写的程序为什么不能正常的运行。 其中一位用GTalk跟我交流&#xff0c;我仔细了看了他的代码&#xff0c;没看出问题&#xff0c;把代码保存在本地&#xff0c;打开Firefox的错误控制台&#xff0c;用…

脉冲时间宽度c语言,什么是脉冲宽度_脉冲宽度是什么意思

脉冲宽度是个很广泛的词&#xff0c;在不同的领域&#xff0c;脉冲宽度有不同的含义。脉冲宽度从学术角度讲就是电流或者电压随时间有规律变化的时间宽度&#xff0c;平时研究主要是方波&#xff0c;三角波&#xff0c;锯齿波&#xff0c;正弦函数波等等&#xff0c;这些波形变…