Skip to content

Commit

Permalink
update #92 benckmark
Browse files Browse the repository at this point in the history
  • Loading branch information
guonaihong committed Nov 29, 2019
1 parent 2304460 commit 99a7deb
Show file tree
Hide file tree
Showing 5 changed files with 123 additions and 67 deletions.
105 changes: 60 additions & 45 deletions bench/report.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"io"
"io/ioutil"
"net/http"
"os"
"sync/atomic"
"time"
)
Expand All @@ -19,27 +20,30 @@ type result struct {

// 数据字段,每个字段都用于显示
type report struct {
Concurrency int //并发数
Failed int32 //出错的连接数
Tps float64
Duration time.Duration // 连接总时间
TotalBody int32 // 统计所有body大小
TotalRead int32 // 统计所有read的流量
SendNum int // 已经发送的http 请求
Kbs float64
Mean float64
AllMean float64
Percentage55 time.Duration
Percentage66 time.Duration
Percentage75 time.Duration
Percentage80 time.Duration
Percentage90 time.Duration
Percentage99 time.Duration
Percentage100 time.Duration
StatusCodes map[int]int
Concurrency int //并发数
Failed int32 //出错的连接数
CompleteRequest int32 //正常的请求数
TotalRead int32 // 统计所有read的流量
Tps float64
Duration time.Duration // 连接总时间
Kbs float64
Mean float64
AllMean float64
Percentage55 time.Duration
Percentage66 time.Duration
Percentage75 time.Duration
Percentage80 time.Duration
Percentage90 time.Duration
Percentage95 time.Duration
Percentage98 time.Duration
Percentage99 time.Duration
Percentage100 time.Duration
StatusCodes map[int]int
}

type Report struct {
SendNum int // 已经发送的http 请求
TotalBody int32 // 统计所有body大小
report
Number int // 发送总次数
step int // 动态报表输出间隔
Expand All @@ -50,6 +54,7 @@ type Report struct {
cancel func()
req *http.Request

startTime time.Time
*http.Client
}

Expand All @@ -69,13 +74,14 @@ func NewReport(ctx context.Context, c, n int, duration time.Duration, req *http.
StatusCodes: make(map[int]int, 2),
Duration: duration,
},
waitQuit: make(chan struct{}),
Number: n,
step: step,
ctx: ctx,
cancel: cancel,
req: req,
Client: client,
waitQuit: make(chan struct{}),
Number: n,
step: step,
ctx: ctx,
cancel: cancel,
req: req,
Client: client,
startTime: time.Now(),
}
}

Expand All @@ -90,30 +96,34 @@ func (r *Report) Init() {

// 负责构造压测http 链接和统计压测元数据
func (r *Report) Process(work chan struct{}) {
start := time.Now()

req, err := cloneRequest(r.req)
if err != nil {
//todo 归类到错误报表里面
return
}
for range work {
start := time.Now()

req, err := cloneRequest(r.req)
if err != nil {
//todo 归类到错误报表里面
fmt.Printf("err = %s\n", err)
return
}

resp, err := r.Do(req)
if err != nil {
//todo 归类到错误报表里面
return
}
resp, err := r.Do(req)
if err != nil {
//todo 归类到错误报表里面
fmt.Printf("err = %s\n", err)
return
}

bodySize := resp.ContentLength
if bodySize == -1 { // chunck size, 凭感觉加的, TODO 确认下
bodySize, err = io.Copy(ioutil.Discard, resp.Body)
}
bodySize := resp.ContentLength
if bodySize == -1 { // chunck size, 凭感觉加的, TODO 确认下
bodySize, err = io.Copy(ioutil.Discard, resp.Body)
}

resp.Body.Close()
resp.Body.Close()

r.allResult <- result{
time: float64(time.Now().Sub(start)) / float64(time.Millisecond),
statusCode: resp.StatusCode,
r.allResult <- result{
time: float64(time.Now().Sub(start)) / float64(time.Millisecond),
statusCode: resp.StatusCode,
}
}
}

Expand Down Expand Up @@ -241,4 +251,9 @@ func (r *Report) startReport() {
}

func (r *Report) outputReport() {
r.Duration = time.Now().Sub(r.startTime)
r.Tps = float64(r.SendNum) / r.Duration.Seconds()

tmpl := newTemplate()
tmpl.Execute(os.Stdout, r.report)
}
48 changes: 28 additions & 20 deletions bench/tmpl.go
Original file line number Diff line number Diff line change
@@ -1,25 +1,33 @@
package bench

import (
"text/template"
)

var tmpl = `
Status Codes: 200:541449 [code:count]
Concurrency Level: .Concurrency
Time taken for tests: .Time seconds
Complete requests: .Total
Failed requests: .Failed
Total transferred: .Recv bytes
HTML transferred: 0 bytes
Requests per second: .Tps [#/sec] (mean)
Time per request: .Mean [ms] (mean)
Time per request: .AllMean [ms] (mean, across all concurrent requests)
Transfer rate: .Kbs [Kbytes/sec] received
Status Codes: {{range $code, $num := .StatusCodes}} {{$code}}:{{$num}} {{end}} [code:count]
Concurrency Level: {{.Concurrency}}
Time taken for tests: {{.Duration}}
Complete requests: {{.CompleteRequest}}
Failed requests: {{.Failed}}
Total transferred: {{.TotalRead}} bytes
Requests per second: {{.Tps}} [#/sec] (mean)
Time per request: {{.Mean}} [ms] (mean)
Time per request: {{.AllMean}} [ms] (mean, across all concurrent requests)
Transfer rate: {{.Kbs}} [Kbytes/sec] received
Percentage of the requests served within a certain time (ms)
50% .Percentage55 ms
66% .Percentage66 ms
75% .Percentage75 ms
80% .Percentage80 ms
90% .Percentage90 ms
95% .Percentage95 ms
98% .Percentage98 ms
99% .Percentage99 ms
100% .Percentage100 ms
50% {{.Percentage55}}
66% {{.Percentage66}}
75% {{.Percentage75}}
80% {{.Percentage80}}
90% {{.Percentage90}}
95% {{.Percentage95}}
98% {{.Percentage98}}
99% {{.Percentage99}}
100% {{.Percentage100}}
`

// 后面要加新的显示格式,只要加新的模版就行
func newTemplate() *template.Template {
return template.Must(template.New("text").Parse(tmpl))
}
32 changes: 32 additions & 0 deletions bench/tmpl_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package bench

import (
"github.com/stretchr/testify/assert"
"os"
"testing"
"time"
)

func Test_Bench_newTemplate(t *testing.T) {
tmpl := newTemplate()

r := report{
Failed: 3,
Percentage55: time.Second,
Percentage66: 2 * time.Second,
Percentage75: 3 * time.Second,
Percentage80: 4 * time.Second,
Percentage90: 5 * time.Second,
Percentage95: 6 * time.Second,
Percentage98: 7 * time.Second,
Percentage99: 8 * time.Second,
Percentage100: 9 * time.Second,
StatusCodes: map[int]int{
200: 100,
500: 3,
},
}

err := tmpl.Execute(os.Stdout, r)
assert.NoError(t, err)
}
4 changes: 2 additions & 2 deletions bench_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ func Test_Bench_Number(t *testing.T) {
router := setup_bench_number(&total)
ts := httptest.NewServer(http.HandlerFunc(router.ServeHTTP))

err := GET(ts.URL).
err := POST(ts.URL).
SetJSON(H{"key": "val"}).
FilterBench().
Concurrent(20).
Concurrent(4).
Number(bench_number).
Do()

Expand Down
1 change: 1 addition & 0 deletions decode/decode_core.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ func decodeCore(val reflect.Value, sf reflect.StructField, setter setter, tagNam
}

tag := sf.Tag.Get(tagName)

if err = decodeCore(val.Field(i), sf, setter, tag); err != nil {
return
}
Expand Down

0 comments on commit 99a7deb

Please sign in to comment.