质疑的点

本次主要质疑的是:测试没有数据库查询:大家觉得加上 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 数据库查询性能对比相关推荐

  1. beego 显示html文件,[Beego] 内置的模板函数(不同格式的字符串和html的互转)

    在使用beego框架的时候,常常需要把不同形式的字符串转化为html,有时候为了安全考虑会将html转义,而有时候希望能显示html标签.在存储到db中后,再取出来的显示是原本的,即html标签不会生 ...

  2. beego使用php,介绍beego、nginx性能测试实例

    测试工具:ab(apacheBench) 硬件环境: Intel xeon cpu E5-2682 v4 2.50GHz 4 core 8GBytes 内存 软件环境: ubuntu16 nginx ...

  3. beego mysql按时间排序_beego的数据库操作优化

    1.背景描述 用beego的ORM框架对sqllite进行库操作.项目中配置表存放在sqlite数据中,这样就存对每个表需要进行增删改查的操作.若按照beego提供方式对每一张表去实现增删改查的操作, ...

  4. beego模板语法循环html块,1.69 beego 模板语法指南 - Beego 中文文档

    本文讲述 beego 中使用的模板语法,与 go 模板语法基本相同. 基本语法 go 统一使用了 {{ 和 }} 作为左右标签,没有其他的标签符号.如果您想要修改为其它符号,可以参考 模板标签. 使用 ...

  5. golang beego orm mysql sqlite3 postgresql 模型字段 数据库类型 对应关系

    目录 MySQL Sqlite3 PostgreSQL 关系型字段 在此列出 ORM 推荐的对应数据库类型,自动建表功能也会以此为标准. 默认所有的字段都是 NOT NULL MySQL go mys ...

  6. 阿里云双12服务器和阿里云双12数据库活动又开始了

    一年一度的阿里云双12服务器活动又开始了,非常的便宜,只需原价的二折即可. 双12活动地址 https://m.aliyun.com/act/team1212

  7. 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. ...

  8. oracle 12c 多线程,Oracle 12c(12.1)中性能优化功能增强之通过参数THREADED_EXECTION使用多线程模型...

    1.  后台 UNIX/Linux系统上,Oracle用多进程模型.例如:linux上一个常规安装的数据库会有如下进程列: $ ps -ef | grep [o]ra_ oracle  15356  ...

  9. 鲁大师12月新机性能/流畅榜:小米系包揽性能榜前三,流畅榜上限再突破!

    [鲁大师12月安卓新机性能榜] 随着X90 Pro+ 12月2日正式宣布搭载骁龙8 Gen2,年末旗舰大战正式打响,一众8 Gen2机器的发售也让这个月热闹非凡.新机性能榜TOP5如下:NO.1: # ...

最新文章

  1. python画动态爱心-【Python】五分钟画一条动态心形曲线~
  2. Java读取propertise配置文件_JAVA读取PROPERTIES配置文件
  3. MYSQL常用函数以及分组操作
  4. Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
  5. autojs定时可以选定日期吗_Excel工作表中的7个“一键完成”,你真的都了解、掌握吗?...
  6. mongoose 分页查询
  7. ECS 与 BCH的使用心得 - 引用篇
  8. 加载执行预编译的Sql :prepareStatement
  9. ubuntu怎么看python版本_Ubuntu下Python版本更新问题
  10. 识别出脸部以及给脸部打马赛克
  11. 首个应用到大规模真实工业场景的神经网络控制系统在谷歌上线了
  12. abaqus 关联 子程序_Abaqus2016版本关联子程序教程
  13. vue把jade转换为html,vue 使用Jade模板写html,stylus写css的方法
  14. wegame每次登陆都要滑动验证_wegame登录验证码白屏
  15. grub引导项修复详解_win7开机grub引导修复教程
  16. Linux驱动之TTY(一):概念
  17. 提取单元格中某字符最后出现位置之前的数据
  18. NSSCTF Round#4 Web WP
  19. Intel 处理器模型
  20. FastReport金额大写转换

热门文章

  1. python网格搜索核函数_机器学习笔记——模型调参利器 GridSearchCV(网格搜索)参数的说明...
  2. 【工具】Excel 表格数据转换成Json格式的实用工具 excel2json
  3. Web开发(一)·期末不挂之第五章·CSS盒子模型(盒子模型各属性行级元素和块级元素导航栏的实现)
  4. Linux学习8之Shell编程--基础正则表达式
  5. HDR 拍照模式的原理,实现及应用
  6. struts2+hibernate3+spring3(ssh2)框架下的web应用(1)
  7. orcal 数据库密码修改(表密码,sys密码,system密码)
  8. 微软中国发布“IE8浏览器性能解密”,为金山网盾辟谣
  9. 值得研究的 开源数据库
  10. 批处理(.bat)无限循环,定时,固定时间间隔