java,netcore和nodejs api性能测试
一. 前言
作为有点经验的码农,现在退休在家带孩子。闲来无事,想对使用过的框架(如果写语言容易引战,php是世界上最好的语言)做一个性能测试。
二. 背景
由于毕业后刚开始接触的编程语言是C#, 从aspx时代至mvc3, mvc4, 后来又出来netcore,见证了C#的掘起和没落(至少国内大环境不理想)。 由于大厂的示范效应加上java开源免费(现在oracle也要授权了),生态极好,所以使用spring boot开始编程,说实在的(不要喷),我个人还是比较喜欢C#,因为语法糖太好用了, lambda,匿名函数匿名类,各类型之间的比较...。 由于nodejs的发明,使js变成前后端通吃的一门语言,异步单线程,事件驱动,适用于高并发的场景。 对于接触过的这些语言,我个人最喜欢js,因为弱类型,灵活。。。至于好或者不好,仁者见仁吧。平时一直在做码农也没时间去自己测试各种性能,现在正在赋闲,来测试一下我使用过的几个框架性能,也做一下比较。
三. 框架说明
1. java现在最流行的web框架应该就是spring的全家桶套餐了,关于数据连接,我个人喜欢使用orm, 所以使用springboot + jpa
2. netcore使用自己的mvc框架,数据库使用nhibernate, mvc+ nhibernate
3. nodej 使用egg + typeorm
四. 测试环境
1. 服务器硬件:使用我2012年从原公司100块钱买的退役电脑当服务器,Dell OptiPlex 780,关键配置:CPU:Intel 酷睿2双核 E7500, 内存:8G(自己扩的8G)
2. 服务器系统:服务器使用centos 7.7

初始使用为

3. 数据库: mysql 8.5(放在我的测试机个人笔记本上,避免mysql影响其他框架
4. 测试机(局域网内,TP-link百兆路由器连接, 本人笔记本)配置:

5. 各框架版本:
1) java : 1.8 , spring boot 2.1.4, jpa 2.1.6
2) netcore: 3.1, nhibernate:5.2.7
3) nodejs:v12.16.3, egg:2.15.1 typeorm:0.2.24
五. 测试工具
jmeter 5.1.1
六. 测试计划
准备一张测试表
CREATE TABLE `db_test` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`string_field` varchar(200) DEFAULT NULL,
`int_field` int(11) DEFAULT NULL,
`float_field` float DEFAULT NULL,
`create_time` timestamp NULL DEFAULT NULL,
`medium_string_field` mediumtext,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=585887 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1. 单项测试:
1.1. 新增一条随机数据,由于带宽的原因,不返回。, jmeter 线程数200 循环500次(10万次)
1.2. 按id倒序 查询第1条数据,由于带宽的原因,不返回。 jmeter 线程数200 循环500次(10万次)
1.3. 新增一条随机数据,再删除掉, 由于带宽的原因,不返回。jmeter 线程数200 循环500次(10万次)
1.4. 随机创建1W个数字至数组,由于带宽的原因,不返回。利用自身的排序进行正序排序, jmeter 线程数200 循环500次(10万次)
1.5. 随机创建5W个数字至数组,由于带宽的原因,不返回。利用自身的排序进行正序排序, jmeter 线程数200 循环500次(10万次)
1.6. 随机创建10W个数字至数组,由于带宽的原因,不返回。利用自身的排序进行正序排序, jmeter 线程数200 循环500次(10万次)
1.7. 请求约0.1M的文件,jmeter 线程数200 循环500次(10万次, 由于网卡和路由器的原因,不能在服务器上进行测试)
1.8. 请求约1M的文件,jmeter 线程数200 循环500次(10万次, 由于网卡和路由器的原因,不能在服务器上进行测试)
2. 综合测试:将以上测试项(1.1- 1.6) 放在一起,分别测试并发200(200x1), 600(200x3), 1000(200x5), 5000(200x25), 10000(200x50)
3. 用nodejs 写一个采集服务器数据的程序,每1秒采集一次服务器的CPU和内存的使用情况(通过centos的 top -b n 2 指令)插入至mysql数据库。表也放在测试机上。
CREATE TABLE `env_info` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL COMMENT '名称',
`cpu` decimal(10,3) DEFAULT NULL COMMENT 'CPU占有率',
`mem_private` bigint(20) DEFAULT NULL,
`mem_virtual` bigint(20) DEFAULT NULL,
`mem_usage` decimal(10,3) DEFAULT NULL,
`create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=51119 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
七. 测试指标
1. jmeter聚合报告
2. 资源占用(均为最高占用, 不是平均值)
八. 测试代码
如果需要,可以给我发文件索取:lei_xu@163.com
九. 测试结果
1. jmeter聚合报告

2. 资源占用(均为最高占用, 不是平均值)

十. 结论
1. 从资源占用来看CPU都占满了, 但内存使用情况: java> dotnet > nodejs。
2. 单表数据库操作,
2.1. 吞吐量 nodejs > java > dotnet , nodejs 的吞吐量几乎是java的2倍;
2.2. 平均值和中位数: nodejs > java > dotnet , nodej 几乎是java的1/2,说明nodejs的响应时间最少
2.3. 标准偏差: java > nodejs > dotnet, java 相对其他框架更平稳。
2.4. 异常率:nodejs 在查询时出现了异常,未查原因
综上, nodejs 在小数据转发上具有先天优势,低消耗,转发能力最强,但是java更平稳。
3. 密集运算(排序)
3.1. 吞吐量 java> nodejs > dotnet, 但随着数据量增多,nodejs和java的吞吐量越来越相近(?)
3.2. 平均值和中位数: java> nodejs> dotnet, 但随着数据量增多, nodejs和java的平均值和中位数越来越相近(?)
3.3. 标准偏差:nodejs > java> dotnet , nodejs 标准偏差与其他两个不是一个量级,说明nodejs慢的比较平稳
3.4. 异常率:sort1W时,java出现了异常,未查原因
综上, 密集运算java相对比较强势, nodejs表现中规中矩,相对更平稳。
4. 综合并发
4.1. 吞吐量 java> nodejs > dotnet, java几乎是nodejs的两倍
4.2. 平均值和中位数: java> nodejs> dotnet, java几乎是nodejs的1/2。
4.3. 标准偏差:java > nodejs> dotnet , java更平稳, 但随着并发数增高,java与nodejs相差不大,nodejs相对也平稳。
4.4. 异常率:dotnet出现了异常。
综上, 综合并发上java表现最突出,且运行相对平稳. nodejs由于先天的不足,只有java的1/2, 但运行平稳。
综合以上简单的测试,
java springboot资源占用率最高(可能是设置的), 综合吞吐量最高,运行也最平稳。综合表现最好.
nodejs egg资源占用率最低, 转发小规模数据表现亮眼,符合nodejs本身的特性,由于密集运算的拖累,综合表现不及java, 所以nodejs可以运用在数据转发方面。
dotnet mvc太令我失望了(可能是框架搭的不好)
原创,转载请联系:lei_xu@163.com
java,netcore和nodejs api性能测试的更多相关文章
- [转载]Java 8 日期&时间 API
Java 8 日期和时间 声明 本文转自http://www.journaldev.com/2800/java-8-date-localdate-localdatetime-instant,以mark ...
- 支撑Java NIO 与 NodeJS的底层技术
支撑Java NIO 与 NodeJS的底层技术 众所周知在近几个版本的Java中增加了一些对Java NIO.NIO2的支持,与此同时NodeJS技术栈中最为人称道的优势之一就是其高性能IO,那么我 ...
- Java 8 Date Time API Example Tutorial – LocalDate, Instant, LocalDateTime, Parse and Format
参考 Java 8 Date and Time API is one of the most sought after change for developers. Java has been mis ...
- JAVA JDK 1.6 API中文版.CHM打开chm提示,“ 已取消到该网页的导航”
JAVA JDK 1.6 API中文版.CHM打开chm提示,“ 已取消到该网页的导航” silent fish 装了win7后,打开chm文件,发现很多在xp系统打开正常的chm文件竟然出现问题, ...
- Java中日期时间API小结
Java中为处理日期和时间提供了大量的API,确实有把一件简单的事情搞复杂的嫌疑,各种类:Date Time Timestamp Calendar...,但是如果能够看到时间处理的本质就可以轻松hol ...
- 【Socket编程】Java中网络相关API的应用
Java中网络相关API的应用 一.InetAddress类 InetAddress类用于标识网络上的硬件资源,表示互联网协议(IP)地址. InetAddress类没有构造方法,所以不能直接new出 ...
- Java高并发秒杀API之Service层
Java高并发秒杀API之Service层 第1章 秒杀业务接口设计与实现 1.1service层开发之前的说明 开始Service层的编码之前,我们首先需要进行Dao层编码之后的思考:在Dao层我们 ...
- Java高并发秒杀API之业务分析与DAO层
根据慕课网上关于java高并发秒杀API的课程讲解用maven+ssm+redis实现的一个秒杀系统 参考了codingXiaxw's blog,很详细:http://codingxiaxw.cn/2 ...
- Java 8 新特性-菜鸟教程 (8) -Java 8 日期时间 API
Java 8 日期时间 API Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理. 在旧版的 Java 中,日期时间 API 存在诸多问题,其中有: ...
随机推荐
- 在线教育项目-day05【课程分类管理-添加课程分类】
1.引入依赖 之前测试EasyExcel已经引入过了 2.利用代码生成器生成结构 我们做的只需要更改代码生成器的数据库表即可 3.运行代码生成器 4.书写代码 1.controller @RestCo ...
- Firefox 66 发布,阻止网站自动播放声音
Firefox 66 发布了,此版本在桌面版中带来的新特性包括: Firefox 现在阻止网站自动播放声音,如果需要可以单独调整 改进的搜索体验: 当打开许多选项卡时,可以更快地查找特定网页:现在可以 ...
- 《树莓派学习指南(基于Linux)》——本章小结
本节书摘来自异步社区<树莓派学习指南(基于Linux)>一书中的第二章的本章小结,作者[英]Peter Membrey ,[澳]David Hows ,译者 张志博,孙峻文,更多章节内容可 ...
- 「每天一道面试题」Java类的生命周期包括哪几个阶段?
一个Java类被加载到虚拟机中,它的生命周期才算开始,直到被从内存中卸载,它的生命周期才算结束.从开始到结束,它的整个生命周期包括加载.验证.准备.解析.初始化.使用和卸载7个阶段,其中验证.准备和解 ...
- Merge_Sort
public class Merge_Sort { public static void merge(int a[],int n){ int source; //合并之前数组的大小 int targe ...
- Rabbit and Turtle
知乎上有这样一个问题:如果兔子都在拼命奔跑,是什么给了作为乌龟的你前进的动力? 随着视野的不断开阔,我们难免怀疑自身前进的意义,曾经有很长一段时间我也深陷其中,直到看到余亦多先生的回答才有所感悟. 问 ...
- Jenkins 节点配置
1.配置代理 系统管理---configure Global Security(全局安全设置)---Tcp port for inbound agents---指定端口 服务器防火墙中开放此端口(li ...
- windows下flume 采集如何支持TAILDIR和tail
一.问题:Windows 下 flume采集配置TAILDIR的时候,会报如下错误: agent.sources.seqGenSrc.type = TAILDIR agent.sources.seqG ...
- P1640 连续攻击游戏
题目传送门 Ⅰ.二分图匹配 其实这题应该不难看出是二分图匹配(尽管我没看出来) 每个物品只能用一次,实际上就是1~n的数字对物品的最大匹配 把物品的两个属性向物品编号连边,之后就从数字1一直匹配过去 ...
- Spring 框架介绍 [Spring 优点][Spring 应用领域][体系结构][目录结构][基础 jar 包]
您的"关注"和"点赞",是信任,是认可,是支持,是动力...... 如意见相佐,可留言. 本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新. 目录 ...