PHP和Java性能压测验证
最近在思考建立一个新项目的时候,对语言和框架选择要要怎么考虑。我想,对于技能娴熟、人数较少的团队,并且预期不会做的得很复杂的项目,快速开发会作为主要参考标准;对于技能不娴熟、人数较多的项目,或者预期会做得很复杂的项目,我觉得规范规整是主要考虑条件,因为对于不娴熟的程序员,或者对于业务复杂的大项目,可能要规整到每一条sql语句和每一行代码,那么不能过度封装。
说了这么多跟性能无关的,那让我们来看下一下性能。作为一个从PHP转Java的程序员,我想测一下两种语言在性能上的差异。不排除一些不严谨,测试结果有不准确的可能性。
服务器配置
2核4G Ubuntu
测试工具
JMeter
测试1
测试简单接口(只响应,啥都不干)的qps。预测:PHP接口CPU到达瓶颈,因为线程(JAVA)是比是进程(PHP)更轻量的单位,在线程中内存是可以共享的,而PHP要对每一次请求重新建立和销毁所有的对象,想想差别还是蛮大的。
java接口
@RequestMapping(path="/testt")
@ResponseBody
public String testt(HttpServletRequest request, HttpServletResponse response) {
return "ok";
}
PHP接口
public function testt(Request $request, LiveRecordService $service)
{
return "ok";
}
测试结果
语言 | 每秒吞吐量 | 平均相应速度(ms) | CPU使用程度 |
---|---|---|---|
PHP | 227 | 366 | 100% |
Java | 1175 | 78 | 50% |
PHP 压测结果
Pasted Graphic 9.pngJava 压测结果
Pasted Graphic 8.pngPHP 服务器监控
Pasted Graphic 6.pngJava 服务器监控
Pasted Graphic 7.png测试2
接口进行一次redis和MySQL主键查询,并返回查询数据。预期:由于Java配置了连接池,而PHP相应每个请求都建立Socket连接,三次握手,应该是有性能损失的,由于PHP已经瓶颈了,无法验证这个结论了,展示下测试结果吧。
java
@RequestMapping(path="/testt")
@ResponseBody
public ResponseVO testt(HttpServletRequest request, HttpServletResponse response) {
MallAdmins aa = mallAdminsService.getById(57);
WxUsers bb = redisService.getObject("wxUserInfo:11", WxUsers.class);
return ResponseVO.responseSuc(Lists.newArrayList(aa, bb));
}
PHP
public function testt(Request $request, LiveRecordService $service)
{
$aa = MallAdminModel::where("id", 57)->get();
$bb = Redis::get("wxUserInfo:11");
return LiveResponse::responseSuc([$aa, $bb]);
}
测试结果
语言 | 每秒吞吐量 | 平均相应速度(ms) | CPU使用程度 |
---|---|---|---|
PHP | 155 | 608 | 100% |
Java | 807 | 119 | 80% |
PHP压测结果
image.pngJava 压测结果
image.pngPHP 服务器监控
Pasted Graphic 11.pngJava 服务器监控
Pasted Graphic 10.png总结
符合预期。从实际角度上,我是遇到过接口瓶颈,但最后都发现是程序员有99%的提高空间,因为在系统设计上是程序有99%的改进空间,对于我做过的应用来说PHP的性能都是可以胜任的。但如果就这样否定性能的重要性,我想怕坐井观天。性能是可以用服务器堆的,但是如果是巨大而复杂的项目,服务器成本到最后我相信是指数级增加的。所以,我就保持这样的观点:性能,有比没有好。而对于快速开发这种定义,PHP的Larave框架真的是蛮好的,轮子齐全,PHP生态也还好,Spring的话,原生拿到手,开发是不快的。不过这些都不是问题,Spring也是可以极速开发的,如果哪天需要考虑规范规整,或者性能,那就是向下兼容。