从测试数据来看Node.js和Java EE的性能区别

简介:
本文作者Marc Fasel是一名高级顾问、架构师、 软件开发者。他有着18年的构建大规模、高性能企业App的经验。在这篇 文章里,他通过做 测试的方式(在Node.js App上和Java伺服器App上分别进行 性能测试),一步步将测试过程、结果、结论写出来,分析两者的性能区别。(以下是编译内容)
  本文是通过从CouchDB上读取JSON数据来比较Node.js和Java EE之间的性能的。究竟谁的性能更好些?为了回答这一问题,只有在一系列的性能测试下运行Node.js App和Java EE App,才能得出最终结果来。
   准备阶段
  首先是在Node.js App上和Java伺服器App上分别进行了性能测试。每个App上都是用了相同的后端作为初始Node.js App:CouchDB。除此还使用了CouchBase Single Server版本1.1.3。创造出一万份大小4KB的随机文本样本文件。测试机器是配备2.4 GHZ、Intel Core 2 Duo、4 GB RAM和Mac OS X的iMac。另外,在一个独立的机器上使用Apache JMeter作为测试驱动器。
   Java EE
  Java伺服器是运行在一个版本为7.0.21的Apache Tomcat上的,默认配置运行在Java 1.6上。 数据库驱动程序是版本0.30的CouchDB4J,驱动程序没有缓存选项,所以,没有完成任何配置。
  接下来的这个Java代码是一个伺服器的代码,可以通过CouchDB获取文档,将数据作为一个JSON对象来处理。
  通过使用JMeter测试驱动器来测试伺服器在不同的并发性基础之上,下面的表格数字就展现出不同的并发需求——平均的响应时间,和每秒相应的所对应的回复。
  从表格里就可以看出,当并行需求在增加的时候,响应时间就会有所变化。每10个并行需求的响应时间平均起来是23毫秒,100个并行需求的响应时间平均起来就是243毫秒。
  比较有趣的部分是,响应时间的平均数和并行需求的数量有着线性相关关系,所以,并行需求增长十倍就会导致每个需求的响应时间增长十倍。这使得在每秒钟处理需求数量是相当恒定的,不管有10个并发请求或150个并发请求,都无所谓。在所有观察到的并发服务请求数量大约为每秒420。
  Node.js
  Node.js App 使用Cradle CouchDB驱动程序0.57版本,运行在Node.js 0.10.20,为了给驱动程序创造相等的条件,运行时的缓存必须要关闭的。
  接下来的数据显示Node.js程序通过一个给定的ID从CouchDB里传递同样的JSON文档:
  Node.js系统数目如下:
  正如前面所说的一样,平均的响应时间和并行需求数量呈线性相关关系,每秒钟处理需求数量是相当恒定的。Node.js相对较快20%,例如,在10个并行需求里,509个需求/秒VS.422需求/每秒。
   结论
  Node.js解决问题的速度比Java EE快20%,这的确有点出乎意料——一种解释语言和一种编译语言在一个VM中的速度是一样快的,这没有多年的优化过程是绝对达不到的。
  其实,Node.js和Java EE规模超出正常的服务器需求。每秒400-500的请求数量可以说是相当不错。谷歌是世界上最大的网站,每天有大约50亿个请求,如果换算成秒的话,也就是57870个请求/秒。这也是谷歌域名在世界范围内的需求数量,所以如果你有一个运行在一台机器上的、400需求/秒的网站的话,那你的这个网站可以说是相当的大了。平均每天100万个需求也就意味着11.5需求/秒。这是一个很重要的数字。
  在这个性能测试里,在单线程的Node.js和多线程的Java EE之间的采用不同的并发模型对最后的结果是没有影响的。如果想要在更高并发水平里测试Node.js的性能,就必须要考虑到开放文件数量这一问题。

最新内容请见作者的GitHub页:http://qaseven.github.io/

相关文章
|
5月前
|
存储 缓存 Java
Java 12相比Java 11有哪些性能上的提升?
Java 12相比Java 11有哪些性能上的提升?
162 3
|
5月前
|
Java 测试技术 API
Java Stream API:被低估的性能陷阱与优化技巧
Java Stream API:被低估的性能陷阱与优化技巧
435 114
|
5月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
361 8
|
6月前
|
Java Spring
如何优化Java异步任务的性能?
本文介绍了Java中四种异步任务实现方式:基础Thread、线程池、CompletableFuture及虚拟线程。涵盖多场景代码示例,展示从简单异步到复杂流程编排的演进,适用于不同版本与业务需求,助你掌握高效并发编程实践。(239字)
331 6
|
6月前
|
测试技术 UED 开发者
性能测试报告-用于项目的性能验证、性能调优、发现性能缺陷等应用场景
性能测试报告用于评估系统性能、稳定性和安全性,涵盖测试环境、方法、指标分析及缺陷优化建议,是保障软件质量与用户体验的关键文档。
|
6月前
|
缓存 Java 开发者
Java 开发者必看!ArrayList 和 LinkedList 的性能厮杀:选错一次,代码慢成蜗牛
本文深入解析了 Java 中 ArrayList 和 LinkedList 的性能差异,揭示了它们在不同操作下的表现。通过对比随机访问、插入、删除等操作的效率,指出 ArrayList 在多数场景下更高效,而 LinkedList 仅在特定情况下表现优异。文章强调选择合适容器对程序性能的重要性,并提供了实用的选择法则。
315 3
|
7月前
|
机器学习/深度学习 Java 编译器
解锁硬件潜能:Java向量化计算,性能飙升W倍!
编译优化中的机器相关优化主要包括指令选择、寄存器分配、窥孔优化等,发生在编译后端,需考虑目标平台的指令集、寄存器、SIMD支持等硬件特性。向量化计算利用SIMD技术,实现数据级并行,大幅提升性能,尤其适用于图像处理、机器学习等领域。Java通过自动向量化和显式向量API(JDK 22标准)支持该技术。
305 4
|
7月前
|
Cloud Native 前端开发 Java
WebAssembly 与 Java 结合的跨语言协作方案及性能提升策略研究
本文深入探讨了WebAssembly与Java的结合方式,介绍了编译Java为Wasm模块、在Java中运行Wasm、云原生集成等技术方案,并通过金融分析系统的应用实例展示了其高性能、低延迟、跨平台等优势。结合TeaVM、JWebAssembly、GraalVM、Wasmer Java等工具,帮助开发者提升应用性能与开发效率,适用于Web前端、服务器端及边缘计算等场景。
263 0
|
5月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
269 1
|
5月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
287 1