服务端I/O性能大比拼:Node、PHP、Java和Go(三)

服务端I/O性能大比拼:Node、PHP、Java和Go(三)

谎言,诅咒的谎言和基准

对这些各种模式的上下文切换进行准确的定时是很困难的。也可以说这对你来没有太大作用。所以取而代之,我会给出一些比较这些服务器环境的HTTP服务器性能的基准。请记住,整个端对端的HTTP请求/响应路径的性能与很多因素有关,而这里我放在一起所提供的数据只是一些样本,以便可以进行基本的比较。

对于这些环境中的每一个,我编写了适当的代码以随机字节读取一个64k大小的文件,运行一个SHA-256哈希N次(N在URL的查询字符串中指定,例如.../test.php?n=100),并以十六进制形式打印生成的散列。我选择了这个示例,是因为使用一些一致的I/O和一个受控的方式增加CPU使用率来运行相同的基准测试是一个非常简单的方式。

关于环境使用,更多细节请参考这些基准要点。

首先,来看一些低并发的例子。运行2000次迭代,并发300个请求,并且每次请求只做一次散列(N = 1),可以得到:

![](/uploads/article/2017/08/12/20170812115913_3166.webp)

时间是在全部并发请求中完成请求的平均毫秒数。越低越好。

很难从一个图表就得出结论,但对于我来说,似乎与连接和计算量这些方面有关,我们看到时间更多地与语言本身的一般执行有关,因此更多在于I/O。请注意,被认为是“脚本语言”(输入随意,动态解释)的语言执行速度最慢。

但是如果将N增加到1000,仍然并发300个请求,会发生什么呢 —— 相同的负载,但是hash迭代是之前的100倍(显着增加了CPU负载):

![](/uploads/article/2017/08/12/20170812120018_8148.webp)

忽然之间,Node的性能显着下降了,因为每个请求中的CPU密集型操作都相互阻塞了。有趣的是,在这个测试中,PHP的性能要好得多(相对于其他的语言),并且打败了Java。(值得注意的是,在PHP中,SHA-256实现是用C编写的,执行路径在这个循环中花费更多的时间,因为这次我们进行了1000次哈希迭代)。

现在让我们尝试5000个并发连接(并且N = 1)—— 或者接近于此。不幸的是,对于这些环境的大多数,失败率并不明显。对于这个图表,我们会关注每秒的请求总数。越高越好:

![](/uploads/article/2017/08/12/20170812120257_5766.webp)

每秒的请求总数。越高越好。

这张照片看起来截然不同。这是一个猜测,但是看起来像是对于高连接量,每次连接的开销与产生新进程有关,而与PHP + Apache相关联的额外内存似乎成为主要的因素并制约了PHP的性能。显然,Go是这里的冠军,其次是Java和Node,最后是PHP。

### 结论

综上所述,很显然,随着语言的演进,处理大量I/O的大型应用程序的解决方案也随之不断演进。

为了公平起见,暂且抛开本文的描述,PHP和Java确实有可用于Web应用程序的非阻塞I/O的实现。 但是这些方法并不像上述方法那么常见,并且需要考虑使用这种方法来维护服务器的伴随的操作开销。更不用说你的代码必须以与这些环境相适应的方式进行结构化; “正常”的PHP或Java Web应用程序通常不会在这样的环境中进行重大改动。

作为比较,如果只考虑影响性能和易用性的几个重要因素,可以得到:

语言线程或进程非阻塞I/O易用性

| PHP | 进程 | 否 | | |

| - | | | | |

| Java | 线程 | 可用 | | 需要回调 |

| Node.js | 线程 | 是 | | 需要回调 |

| Go | 线程(Goroutine) | 是 | | 不需要回调 |

线程通常要比进程有更高的内存效率,因为它们共享相同的内存空间,而进程则没有。结合与非阻塞I/O相关的因素,当我们向下移动列表到一般的启动时,因为它与改善I/O有关,可以看到至少与上面考虑的因素一样。如果我不得不在上面的比赛中选出一个冠军,那肯定会是Go。

即便这样,在实践中,选择构建应用程序的环境与你的团队对于所述环境的熟悉程度以及可以实现的总体生产力密切相关。因此,每个团队只是一味地扎进去并开始用Node或Go开发Web应用程序和服务可能没有意义。

事实上,寻找开发人员或内部团队的熟悉度通常被认为是不使用不同的语言和/或不同的环境的主要原因。也就是说,过去的十五年来,时代已经发生了巨大的变化。

Node和java和php,服务端I/O性能大比拼:Node、PHP、Java和Go(三)相关推荐

  1. node和java性能_服务端I/O性能大比拼:Node、PHP、Java和Go(二)

    服务端I/O性能大比拼:Node.PHP.Java和Go(二) 服务端I/O性能大比拼:Node.PHP.Java和Go(二) ### 多线程的方式:Java 所以就在你买了你的第一个域名的时候,Ja ...

  2. php8vsgo,服务端 I/O 性能:Node、PHP、Java、Go 的对比

    原标题:服务端 I/O 性能:Node.PHP.Java.Go 的对比 了解应用程序的输入/输出(I/O)模型意味着理解应用程序处理其数据的载入差异,并揭示其在真实环境中表现.或许你的应用程序很小,在 ...

  3. 服务端 I/O 性能大比拼:Node、PHP、Java、Go哪家强?

    理解应用程序的输入/输出(I/O)模型,意味着其在计划处理负载与残酷的实际使用场景之间的差异.若应用程序比较小,也没有服务于很高的负载,也许它影响甚微.但随着应用程序的负载逐渐上涨,采用错误的I/O模 ...

  4. go java性能_服务端I/O性能大比拼:Node、PHP、Java和Go

    理解应用程序的输入/输出(I/O)模型,意味着其在计划处理负载与残酷的实际使用场景之间的差异.若应用程序比较小,也没有服务于很高的负载,也许它影响甚微.但随着应用程序的负载逐渐上涨,采用错误的I/O模 ...

  5. 服务端I/O性能:Node、PHP、Java、Go的对比

    了解应用程序的输入/输出(I/O)模型意味着理解应用程序处理其数据的载入差异,并揭示其在真实环境中表现.或许你的应用程序很小,在不承受很大的负载时,这并不是个严重的问题;但随着应用程序的流量负载增加, ...

  6. java node对比_服务端I/O性能:Node、PHP、Java、Go的对比

    调剂法度榜样的工作道理如图所示: 你可以看到,这里有两个回调函数.当请求开端时,第一个被调用,当文件数据可用时,第二个被调用. I/O Model Go 在底层,这是经由过程 Go 运行时中的各个部分 ...

  7. node java php_服务端I/O性能:Node、PHP、Java、Go的对比

    这些你明白了么?如今来到了真正有趣的部分:我们来看看一些风行的说话对那些对象的应用,并得出关于易用性和机能之间衡量的结论,以及一些其他有趣小器械. 声明,本文中显示的示例是零碎的(单方面的,只能表现相 ...

  8. Java:socket服务端,socket服务端支持多连接,socket客户端,socket客户端支持发送和接受

    一.Java之socket服务端 新建一个Java工程 命名 给他先创建一个类 在类里面我们做一个main 这里面也需要,创建套接字,IP号,端口号 但是java中有一个类         Serve ...

  9. 五子棋服务端程序java_9网上五子棋对战(java)服务端源码

    9网上五子棋对战(java)服务端源码 网上五子棋对战(java)服务端源码 /* 五子棋游戏是本人在学习java swing时写的一个程序,程序分两部分:服务器端和客户端.运行程序时先运行服务器端, ...

最新文章

  1. 数据结构(莫队算法):国家集训队2010 小Z的袜子
  2. etcd使用之ttl不准确问题
  3. Java 高频面试题:聊一聊 JUC 下的 LinkedBlockingQueue
  4. 结合netstat和awk命令来统计网络连接数
  5. php基础 简书,PHP入门基础
  6. 20190813:(leetcode习题)加一
  7. 扩展GeoServer数据源
  8. Jsonp解决跨域问题原理
  9. 三次握手,为什么不是两次,也不是四次
  10. 暴力破解rar和zip加密压缩包
  11. 斐那契波黄金数列MATLAB,广义斐波那契数列的性质及推广
  12. unity材质球发光_Unity3D中使物体自发光
  13. FOLLOW集合求解
  14. C#通过类的继承来实现判断任意一个三角形并求出它们的周长及面积(等腰三角形,等边三角形,直角三角形,等腰直角三角形)
  15. IT项目经理前景及优劣势分析
  16. 最好的编程语言是怎样的?
  17. 机器学习中的目标函数总结
  18. 河北软件职业技术学院计算机应用工程系,河北软件职业技术学院第四届模特大赛举办成功...
  19. 盛夏来临,数据中心如何应对
  20. js时间戳转时间年月日时分秒

热门文章

  1. 45 Ansible Play-books模式
  2. oracle和mysql查询_ORACLE 数据库 查询语句与DML语句
  3. 博图读取温度的指令_1200读取温度巡检仪 16路
  4. php给留言分配id_如何使用php生成唯一ID的4种方法
  5. centos7开启,关闭防火墙
  6. java中utilities类_Java PHUtilities类代码示例
  7. php中怎么让主键自增长,php – 使用复合主键生成自动增量ID
  8. 关于python变量使用_Python 基础知识关于变量的定义使用
  9. 谈谈你对计算思维和python生态的理解_计算思维的的理解及重要性
  10. python切片操作例题_Python之切片操作