编程语言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,一经查实,立即删除!

相关文章

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…

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

文章目录方法1. 使用配置文件方法2. 使用对象配置参数方法3. 直接操作config的字典对象项目实例方法1. 使用配置文件 首先将配置参数写在文件中,例如: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…

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

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

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

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

Git的GUI工具sourcetree的使用

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

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

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

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

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

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

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

HDU - 5919 Sequence II

题意: 给定长度为n的序列和q次询问。每次询问给出一个区间(L,R),求出区间内每个数第一次出现位置的中位数,强制在线。 题解: 用主席树从右向左的插入点。对于当前点i,如果a[i]出现过…

Django博客--3.创作后台开启

文章目录0.创建admin后台管理员账号1.在 admin 后台注册模型2.汉化应用的标题3.汉化应用下各个模块的名称4.汉化应用下各个模块的属性的名称5.文章列表显示更加详细的信息6.简化新增文章的表单7.自动设置文章作者为当前用户8.设定创建时间为当前时间9.设定修改建时间为保存时的…

raid-6磁盘阵列损坏导致数据丢失的恢复过程(图文教程)

一、故障描述机房突然断电导致整个存储瘫痪,加电后存储依然无法使用。经过用户方工程师诊断后认为是断电导致存储阵列损坏。整个存储是由12块日立硬盘(3T SAS硬盘)组成的RAID-6磁盘阵列,被分成一个卷,分配给几台Vmware…

谈新技术学习方法-如何学习一门新技术新编程语言

学习一门编程语言或者编程技术的方式基本上是这样一个流程: 1,对学习这门语言或者技术的必要性进行评估。比如你是工作需要,或者兴趣所至,甚至是为了把妹。这个必要性关系到你要学多深入,需要学习多长时间。 比如我想…

图像识别自动化android,Android自动化测试

写在开头:Android UI 自动化测试推荐网易的Airtest,也是谷歌推荐的,操作简单,而且基于图像识别根据用户操作界面自动生成Python测试代码JUnit单元测试testImplementation junit:junit:4.12image.pngimage.png使用gradle命令进行单…

如何重构“箭头型”代码

本文主要起因是,一次在微博上和朋友关于嵌套好几层的if-else语句的代码重构的讨论(微博原文),在微博上大家有各式各样的问题和想法。按道理来说这些都是编程的基本功,似乎不太值得写一篇文章,不过我觉得很多…

Django博客--4.开发博客文章详情页

文章目录0.思路引导1.设计文章详情页的 URL2.获取文章的URL3.编写 detail 视图函数4.编写详情页模板5.更改主页中跳转详情页的地址链接6.模板继承--抽取base.html7.模板继承--修改 index.html使其继承base.html8.模板继承--修改detail.html使其继承base.html9.结果展示0.思路引…

10、并发容器,ConcurrentHashMap

Java 提供了不同层面的线程安全支持。在传统集合框架内部,除了 Hashtable 等同步容器,还提供了所谓的同步包装器(Synchronized Wrapper),我们可以调用 Collections 工具类提供的包装方法,来获取一个同步的包…

程序员的本质

Computers are useless. They can only give you answers. – Picasso计算机没有什么作用。他们只能告诉你答案。——毕加索很多人(包括我岳母)认为计算机变得如此智能,所以在不久的未来将不再需要程序员。另外一些人认为程序员是天才&#x…

剖析管理所有大数据组件的可视化利器:Hue

欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 日常的大数据使用都是在服务器命令行中…

Django博客--5.让博客支持 Markdown 语法和代码高亮

文章目录0.前言1.安装 Python Markdown2.在 detail 视图中解析 Markdown3.safe 标签4.代码高亮5.效果展示0.前言 Markdown 是一种 HTML 文本标记语言,只要遵循它约定的语法格式,Markdown 的解析工具就能够把 Markdown 文档转换为标准的 HTML 文档&#…