123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- package main
- import (
- "context"
- "flag"
- "math/rand"
- "net/url"
- "strconv"
- "time"
- "go-common/app/service/main/riot-search/model"
- "go-common/library/log"
- bm "go-common/library/net/http/blademaster"
- xtime "go-common/library/time"
- "github.com/ivpusic/grpool"
- )
- var (
- minID uint64 = 1
- maxID uint64 = 28731894
- keyword = []string{"世界", "鬼畜", "自制", "搬运", "动漫", "崩坏", "搞笑", "德国", "弹幕", "乱入", "吸血鬼", "可怕", "骑士", "团长", "守护"}
- times int
- count int
- thread int
- client *bm.Client
- args []*model.RiotSearchReq
- uri string
- maxElapsedTime []int64
- avgElapsedTime []int64
- )
- //生成count个[start,end)结束的不重复的随机数
- func generateRandomNumber(start uint64, end uint64, count int) []uint64 {
- if end < start || (end-start) < uint64(count) {
- return nil
- }
- nums := make([]uint64, 0)
- r := rand.New(rand.NewSource(time.Now().UnixNano()))
- for len(nums) < count {
- num := uint64(r.Intn(int(end-start))) + start
- exist := false
- for _, v := range nums {
- if v == num {
- exist = true
- break
- }
- }
- if !exist {
- nums = append(nums, num)
- }
- }
- return nums
- }
- func benchmarkSearch(count int, times int, gid int) {
- var totalTime int64
- var maxTime int64
- for i := 0; i < times; i++ {
- // random chose params to use
- arg := args[rand.Intn(len(args))]
- params := url.Values{}
- var aids string
- for _, id := range arg.IDs {
- aids += strconv.FormatUint(id, 10)
- }
- text := arg.Keyword
- params.Set("aids", aids)
- params.Set("keyword", text)
- params.Set("pn", "1")
- params.Set("ps", "20")
- start := time.Now()
- err := client.Post(context.TODO(), uri, "", params, nil)
- if err != nil {
- panic(err)
- }
- elapsed := time.Since(start)
- if int64(elapsed) > maxTime {
- maxTime = int64(elapsed)
- }
- totalTime += int64(elapsed)
- }
- avgElapsedTime[gid] = totalTime / (1000 * 1000 * int64(times))
- maxElapsedTime[gid] = maxTime / (1000 * 1000)
- }
- func init() {
- flag.IntVar(×, "times", 100, "单个线程测试次数")
- flag.IntVar(&count, "count", 100000, "每次测试aid个数")
- flag.IntVar(&thread, "thread", 10, "线程数")
- flag.StringVar(&uri, "uri", "http://127.0.0.1:7871/x/internal/riot-search/arc/ids", "请求url")
- flag.Parse()
- log.Info("times: %d, count:%d, thread:%d, uri:%s", times, count, thread, uri)
- log.Info("init http client")
- app := &bm.App{
- Key: "test",
- Secret: "test",
- }
- clientConf := &bm.ClientConfig{
- App: app,
- Timeout: xtime.Duration(time.Second * 1),
- Dial: xtime.Duration(time.Second),
- KeepAlive: xtime.Duration(time.Second * 60),
- }
- client = bm.NewClient(clientConf)
- log.Info("init 10 http request params, random chose one to test")
- args = make([]*model.RiotSearchReq, 10)
- rand.Seed(time.Now().UnixNano())
- for i := 0; i < 10; i++ {
- arg := &model.RiotSearchReq{
- IDs: generateRandomNumber(minID, maxID, count),
- Keyword: keyword[rand.Intn(len(keyword))],
- }
- args[i] = arg
- }
- maxElapsedTime = make([]int64, thread)
- avgElapsedTime = make([]int64, thread)
- log.Info("init params finished")
- }
- func main() {
- log.Info("start test")
- if thread >= 1000 {
- panic("thread large than 1000 is not allowed")
- }
- pool := grpool.NewPool(thread, 10240)
- defer pool.Release()
- pool.WaitCount(thread)
- for i := 0; i < thread; i++ {
- threadNum := i
- pool.JobQueue <- func() {
- benchmarkSearch(count, times, threadNum)
- pool.JobDone()
- }
- }
- pool.WaitAll()
- log.Info("avg elapsed times list: %v", avgElapsedTime)
- log.Info("max elapsed times list: %v", maxElapsedTime)
- log.Info("test finished")
- }
|