Advertisement
Guest User

Untitled

a guest
Oct 1st, 2014
38
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.95 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "flag"
  5.     "fmt"
  6.     "log"
  7.     "net/http"
  8.     "runtime"
  9.     "time"
  10. )
  11.  
  12. var (
  13.     reqs int
  14.     max  int
  15. )
  16.  
  17. func init() {
  18.     flag.IntVar(&reqs, "reqs", 100000000, "Total requests")
  19.     flag.IntVar(&max, "concurrent", 2000, "Maximum concurrent requests")
  20. }
  21.  
  22. type Response struct {
  23.     *http.Response
  24.     err error
  25. }
  26.  
  27. // Dispatcher
  28. func dispatcher(reqChan chan *http.Request) {
  29.     defer close(reqChan)
  30.     for i := 0; i < reqs; i++ {
  31.         req, err := http.NewRequest("GET", "http://localhost/", nil)
  32.         if err != nil {
  33.             log.Println(err)
  34.         }
  35.         reqChan <- req
  36.     }
  37. }
  38.  
  39. // Worker Pool
  40. func workerPool(reqChan chan *http.Request, respChan chan Response) {
  41.     t := &http.Transport{}
  42.     for i := 0; i < max; i++ {
  43.         go worker(t, reqChan, respChan)
  44.     }
  45. }
  46.  
  47. // Worker
  48. func worker(t *http.Transport, reqChan chan *http.Request, respChan chan Response) {
  49.     for req := range reqChan {
  50.         resp, err := t.RoundTrip(req)
  51.         r := Response{resp, err}
  52.         respChan <- r
  53.     }
  54. }
  55.  
  56. // Consumer
  57. func consumer(respChan chan Response) (int64, int64) {
  58.     var (
  59.         conns int64
  60.         size  int64
  61.     )
  62.     for conns < int64(reqs) {
  63.         select {
  64.         case r, ok := <-respChan:
  65.             if ok {
  66.                 if r.err != nil {
  67.                     log.Println(r.err)
  68.                 } else {
  69.                     size += r.ContentLength
  70.                     if err := r.Body.Close(); err != nil {
  71.                         log.Println(r.err)
  72.                     }
  73.                 }
  74.                 conns++
  75.             }
  76.         }
  77.     }
  78.     return conns, size
  79. }
  80.  
  81. func main() {
  82.     flag.Parse()
  83.     runtime.GOMAXPROCS(runtime.NumCPU())
  84.     reqChan := make(chan *http.Request)
  85.     respChan := make(chan Response)
  86.     start := time.Now()
  87.     go dispatcher(reqChan)
  88.     go workerPool(reqChan, respChan)
  89.     conns, size := consumer(respChan)
  90.     took := time.Since(start)
  91.     ns := took.Nanoseconds()
  92.     av := ns / conns
  93.     average, err := time.ParseDuration(fmt.Sprintf("%d", av) + "ns")
  94.     if err != nil {
  95.         log.Println(err)
  96.     }
  97.     fmt.Printf("Connections:\t%d\nConcurrent:\t%d\nTotal size:\t%d bytes\nTotal time:\t%s\nAverage time:\t%s\n", conns, max, size, took, average)
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement