package main
import (	"fmt"	"net/http"	"sort"	"sync"	"time")
type respData struct {	duration float32	status   int}
var wg sync.WaitGroup
func PressureTesting(url string, TotalNum, concurrentNum int) {	startTime := time.Now().UnixNano()    times := TotalNum/concurrentNum    resChan := make(chan respData, TotalNum)	for j := 0; j < times; j++ {		for i := 0; i < concurrentNum; i++ {			wg.Add(1)			go Testing(url, resChan)		}		wg.Wait()		fmt.Println("第",j,"次并发请求",len(resChan))	}	close(resChan)	testResultTime(resChan)	fmt.Println("本次执行时间:",float32(time.Now().UnixNano()-startTime) / 1000000,"毫秒")}
func Testing(url string, ch chan<-respData) {	var status int	startTime := time.Now().UnixNano()	timeout := time.Duration(time.Second)	client := http.Client{		Timeout: timeout,	}	reqData, err := client.Get(url)	duration := float32(time.Now().UnixNano()-startTime) / 1000000	if err != nil{		status = 0	} else {		status = reqData.StatusCode		_ = reqData.Body.Close()	}	ch <- respData{		duration: duration,		status:   status,	}	wg.Done()}
func testResultTime(ch chan respData) {	fmt.Println("管道内元素数量", len(ch))	var	sum, timeCount95 float32	var count = 0	var Count95s []float64	var wrongNum int	for v := range ch {		if v.status == 200 {			sum += v.duration			count++			Count95s = append(Count95s, float64(v.duration))		}	}	avg := sum / float32(count)	sort.Float64s(Count95s)	cutKey := int(float32(len(Count95s)) * 0.95)	if Count95s != nil {		timeCount95 = float32(Count95s[cutKey])	} else {		timeCount95 = float32(0)	}	fmt.Println("平均响应时间:",avg)	fmt.Println("95%响应时间:",timeCount95)	fmt.Println("异常返回次数:",wrongNum)}
func main() {	PressureTesting("https://www.baidu.com/", 100, 10)}
评论