php beego,MixPHP 2.2 / Beego 1.12 数据库查询性能对比
质疑的点
本次主要质疑的是:测试没有数据库查询:大家觉得加上 db 查询会很不一样,但是我认为基准测试 hello world 代表天花板,还是有一些意义的,db 查询性能方便我猜测 mix 与 beego 应该是性能接近,我现在还没开始测试,等下看结果。
测试没有序列化:本次测试,我也加上 json 序列化。
ab 测试不适合高并发测试:这一点我详细列举很多举例,试图说明同样的环境下,不同的压力,强弱的数值会变,但结果是不变的,这基本属于物理原则,既然说服不了对方,那我就本次采用 wrk 测试吧。当然测试没办法做到条件绝对一致的,但结果还是可以参考的
环境
硬件CPU: Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz
CPU(s): 12
Mem: 15G
Linux version 3.10.0-957.10.1.el7.x86_64
数据库:本机
测试命令wrk -d 120 -t 4 http://127.0.0.1:*/
连接池最大闲置:5
最大连接:50
线程数为了最大化公平,本次两个框架都采用 1 个线程测试
MixPHP 2.2
代码:为了公平,我把配置里的默认中间件都移除了,之前测试没有移除。<?php
namespace App\Web\Controllers;
use App\Common\Helpers\ResponseHelper;
use Mix\Http\Message\ServerRequest;
use Mix\Http\Message\Response;
/**
* Class IndexController
* @package App\Web\Controllers
* @author liu,jian
*/
class IndexController
{
/**
* Index
* @param ServerRequest $request
* @param Response $response
* @return Response
*/
public function index(ServerRequest $request, Response $response)
{
/** @var Database $db */
$db = context()->get('database');
$result = $db->prepare('select * from test limit 1')->queryAll();
$content = json_encode($result);
return ResponseHelper::html($response, $content);
}
}启动方式/usr/local/php-7.3.12/bin/php mix/bin/mix.php web -d进程[nobody@~]$ ps -ef | grep mix.php
nobody 25972 1 0 18:36 ? 00:00:00 /usr/local/php-7.3.12/bin/php mix/bin/mix.php web -d响应内容[nobody@~]$ curl http://127.0.0.1:9501/
[{"id":1,"name":"3"}]测试结果:测试了很多次,在 9936.36~10080.25 左右[nobody@~]$ wrk -d 120 -t 4 http://127.0.0.1:9501/
Running 2m test @ http://127.0.0.1:9501/
4 threads and 10 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 806.18us 501.04us 51.95ms 97.58%
Req/Sec 2.53k 245.91 5.92k 79.28%
1210639 requests in 2.00m, 218.21MB read
Requests/sec: 10080.25
Transfer/sec: 1.82MBCPU 状态:稳定在 99.3~99.7% 左右。PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
25972 nobody 20 0 1166992 12368 4064 R 99.7 0.1 2:41.11 php
Beego 1.12
代码:使用 runtime.GOMAXPROCS(1) 限制了线程数。package main
import (
"encoding/json"
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
_ "hello/routers"
"runtime"
)
type Test struct {
Id int `orm:"column(id)"json:"id"`
Name string `orm:"column(name)"json:"name"`
}
func init() {
orm.RegisterModel(new(Test))
orm.RegisterDriver("mysql", orm.DRMySQL)
maxIdle := 5
maxConn := 50
orm.RegisterDataBase("default", "mysql", "*****@tcp(***:3306)/test?charset=utf8&loc=Asia%2FShanghai&parseTime=true", maxIdle, maxConn)
}
type IndexController struct {
beego.Controller
}
func (c *IndexController) Index() {
o := orm.NewOrm();
var row []*Test
o.Raw("select * from test limit 1").QueryRows(&row);
js, _ := json.Marshal(row)
c.Ctx.Output.Body(js)
}
func main() {
runtime.GOMAXPROCS(1) // 限制使用线程数
beego.Router("/index", &IndexController{}, "*:Index")
beego.Run()
}启动方式
为了不让日志影响到性能,屏蔽输出。nohup ./gobeego_linux > /dev/null 2>&1 &进程[nobody@~]$ ps -ef| grep bee
nobody 27316 1 0 18:37 ? 00:00:00 ./gobeego_linux响应内容[nobody@~]$ curl http://127.0.0.1:8989/index
[{"id":1,"name":"3"}]测试结果:测试了很多次,在 16306.15~16327.19 左右[nobody@~]$ wrk -d 120 -t 4 http://127.0.0.1:8989/index
Running 2m test @ http://127.0.0.1:8989/index
4 threads and 10 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 521.18us 427.56us 29.46ms 92.23%
Req/Sec 4.10k 260.69 4.74k 79.96%
1959389 requests in 2.00m, 310.19MB read
Requests/sec: 16327.19
Transfer/sec: 2.58MBCPU 状态:稳定在 99.7~100.3% 左右。PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
27316 nobody 20 0 114736 10660 5008 S 100.3 0.1 0:39.87 gobeego_linux
修改执行模式
有网友评论:beego dev 模式性能会差一些,于是重新测试修改执行模式为 prod
测试发现 prod 比 dev 性能高大概 2666 Requests/sec[nobody@tmp]$ cat conf/app.conf
appname = hello
httpport = 8989
runmode = prod测试结果[nobody@~]$ wrk -d 120 -t 4 http://127.0.0.1:8989/index
Running 2m test @ http://127.0.0.1:8989/index
4 threads and 10 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 453.55us 427.00us 29.69ms 93.22%
Req/Sec 4.77k 328.51 5.70k 82.71%
2279372 requests in 2.00m, 299.98MB read
Requests/sec: 18993.39
Transfer/sec: 2.50MB
为避免不同时间的测试数据浮动,同时也再测试一下 MixPHP[nobody@tmp]$ wrk -d 120 -t 4 http://127.0.0.1:9501/
Running 2m test @ http://127.0.0.1:9501/
4 threads and 10 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 821.18us 347.98us 20.65ms 89.92%
Req/Sec 2.47k 227.03 5.80k 81.13%
1181243 requests in 2.00m, 212.91MB read
Requests/sec: 9835.54
Transfer/sec: 1.77MB
移除序列化,只测试数据库
有网友评论:PHP 的 json_encode 可能是性能差的原因,于是重新测试MixPHP
代码修改<?php
namespace App\Web\Controllers;
use App\Common\Helpers\ResponseHelper;
use Mix\Http\Message\ServerRequest;
use Mix\Http\Message\Response;
/**
* Class IndexController
* @package App\Web\Controllers
* @author liu,jian
*/
class IndexController
{
/**
* Index
* @param ServerRequest $request
* @param Response $response
* @return Response
*/
public function index(ServerRequest $request, Response $response)
{
/** @var Database $db */
$db = context()->get('database');
$result = $db->prepare('select * from test limit 1')->queryAll();
$content = 'hello, world!'; // 不序列化
return ResponseHelper::html($response, $content);
}
}
测试结果[nobody@tmp]$ wrk -d 120 -t 4 http://127.0.0.1:9501/
Running 2m test @ http://127.0.0.1:9501/
4 threads and 10 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 819.22us 309.68us 23.65ms 87.91%
Req/Sec 2.47k 221.66 3.07k 76.21%
1179327 requests in 2.00m, 203.57MB read
Requests/sec: 9827.51
Transfer/sec: 1.70MBBeego
代码修改package main
import (
"encoding/json"
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
_ "hello/routers"
"runtime"
)
type Test struct {
Id int `orm:"column(id)"json:"id"`
Name string `orm:"column(name)"json:"name"`
}
func init() {
orm.RegisterModel(new(Test))
orm.RegisterDriver("mysql", orm.DRMySQL)
maxIdle := 5
maxConn := 50
orm.RegisterDataBase("default", "mysql", "*****@tcp(***:3306)/test?charset=utf8&loc=Asia%2FShanghai&parseTime=true", maxIdle, maxConn)
}
type IndexController struct {
beego.Controller
}
func (c *IndexController) Index() {
o := orm.NewOrm();
var row []*Test
o.Raw("select * from test limit 1").QueryRows(&row);
js := []byte("hello, world!") // 不序列化
c.Ctx.Output.Body(js)
}
func main() {
runtime.GOMAXPROCS(1) // 限制使用线程数
beego.Router("/index", &IndexController{}, "*:Index")
beego.Run()
}
测试结果[nobody@tmp]$ wrk -d 120 -t 4 http://127.0.0.1:8989/index
Running 2m test @ http://127.0.0.1:8989/index
4 threads and 10 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 436.00us 363.84us 24.06ms 92.74%
Req/Sec 4.94k 319.79 5.99k 79.62%
2358720 requests in 2.00m, 292.43MB read
Requests/sec: 19652.80
Transfer/sec: 2.44MB
总结一下
测试结果 mix 比 beego 数据库查询+序列化的综合性能要低 38.3%,beego 更加优秀,不过 mix 动态脚本语言能做到这样也是蛮可以了(我只能这样安慰自己,但也是事实),显然我打赌输了,愿赌服输。框架线程数CPU数值PHP 7.3.12 + Swoole 4.4.14 + MixPHP 2.2199.3~99.7%9936.36~10080.25
Go 1.13.4 + Beego 1.12.1199.7~100.3%16306.15~16327.19开启 beego prod 模式
更换模式后 beego 性能得到了显著提升,测试结果 mix 比 beego 数据库查询+序列化的综合性能要低 48.2%。框架线程数数值PHP 7.3.12 + Swoole 4.4.14 + MixPHP 2.219835.54
Go 1.13.4 + Beego 1.12.1118993.39移除序列化,只测试数据库
移除序列化后测试结果变化非常小,说明序列化在这个测试中影响很小,也就是序列化相对于 db 查询来说,对整体性能影响比我们想象的要小很多。框架线程数数值PHP 7.3.12 + Swoole 4.4.14 + MixPHP 2.219827.51
Go 1.13.4 + Beego 1.12.1119652.80
php beego,MixPHP 2.2 / Beego 1.12 数据库查询性能对比相关推荐
- beego 显示html文件,[Beego] 内置的模板函数(不同格式的字符串和html的互转)
在使用beego框架的时候,常常需要把不同形式的字符串转化为html,有时候为了安全考虑会将html转义,而有时候希望能显示html标签.在存储到db中后,再取出来的显示是原本的,即html标签不会生 ...
- beego使用php,介绍beego、nginx性能测试实例
测试工具:ab(apacheBench) 硬件环境: Intel xeon cpu E5-2682 v4 2.50GHz 4 core 8GBytes 内存 软件环境: ubuntu16 nginx ...
- beego mysql按时间排序_beego的数据库操作优化
1.背景描述 用beego的ORM框架对sqllite进行库操作.项目中配置表存放在sqlite数据中,这样就存对每个表需要进行增删改查的操作.若按照beego提供方式对每一张表去实现增删改查的操作, ...
- beego模板语法循环html块,1.69 beego 模板语法指南 - Beego 中文文档
本文讲述 beego 中使用的模板语法,与 go 模板语法基本相同. 基本语法 go 统一使用了 {{ 和 }} 作为左右标签,没有其他的标签符号.如果您想要修改为其它符号,可以参考 模板标签. 使用 ...
- golang beego orm mysql sqlite3 postgresql 模型字段 数据库类型 对应关系
目录 MySQL Sqlite3 PostgreSQL 关系型字段 在此列出 ORM 推荐的对应数据库类型,自动建表功能也会以此为标准. 默认所有的字段都是 NOT NULL MySQL go mys ...
- 阿里云双12服务器和阿里云双12数据库活动又开始了
一年一度的阿里云双12服务器活动又开始了,非常的便宜,只需原价的二折即可. 双12活动地址 https://m.aliyun.com/act/team1212
- Exadata X2-2 vs EMC Greenplum DCA vs Netezza TwinFin 12主要配置大对比
下图列出了Oracle Exadata X2-2 vs EMC Greenplum DCA vs Netezza TwinFin 12 三种一体机的主要配置对比: 转载于:https://www. ...
- oracle 12c 多线程,Oracle 12c(12.1)中性能优化功能增强之通过参数THREADED_EXECTION使用多线程模型...
1. 后台 UNIX/Linux系统上,Oracle用多进程模型.例如:linux上一个常规安装的数据库会有如下进程列: $ ps -ef | grep [o]ra_ oracle 15356 ...
- 鲁大师12月新机性能/流畅榜:小米系包揽性能榜前三,流畅榜上限再突破!
[鲁大师12月安卓新机性能榜] 随着X90 Pro+ 12月2日正式宣布搭载骁龙8 Gen2,年末旗舰大战正式打响,一众8 Gen2机器的发售也让这个月热闹非凡.新机性能榜TOP5如下:NO.1: # ...
最新文章
- python画动态爱心-【Python】五分钟画一条动态心形曲线~
- Java读取propertise配置文件_JAVA读取PROPERTIES配置文件
- MYSQL常用函数以及分组操作
- Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
- autojs定时可以选定日期吗_Excel工作表中的7个“一键完成”,你真的都了解、掌握吗?...
- mongoose 分页查询
- ECS 与 BCH的使用心得 - 引用篇
- 加载执行预编译的Sql :prepareStatement
- ubuntu怎么看python版本_Ubuntu下Python版本更新问题
- 识别出脸部以及给脸部打马赛克
- 首个应用到大规模真实工业场景的神经网络控制系统在谷歌上线了
- abaqus 关联 子程序_Abaqus2016版本关联子程序教程
- vue把jade转换为html,vue 使用Jade模板写html,stylus写css的方法
- wegame每次登陆都要滑动验证_wegame登录验证码白屏
- grub引导项修复详解_win7开机grub引导修复教程
- Linux驱动之TTY(一):概念
- 提取单元格中某字符最后出现位置之前的数据
- NSSCTF Round#4 Web WP
- Intel 处理器模型
- FastReport金额大写转换
热门文章
- python网格搜索核函数_机器学习笔记——模型调参利器 GridSearchCV(网格搜索)参数的说明...
- 【工具】Excel 表格数据转换成Json格式的实用工具 excel2json
- Web开发(一)·期末不挂之第五章·CSS盒子模型(盒子模型各属性行级元素和块级元素导航栏的实现)
- Linux学习8之Shell编程--基础正则表达式
- HDR 拍照模式的原理,实现及应用
- struts2+hibernate3+spring3(ssh2)框架下的web应用(1)
- orcal 数据库密码修改(表密码,sys密码,system密码)
- 微软中国发布“IE8浏览器性能解密”,为金山网盾辟谣
- 值得研究的 开源数据库
- 批处理(.bat)无限循环,定时,固定时间间隔