Skip to content

Instantly share code, notes, and snippets.

@osyoyu
Created May 4, 2020 16:59
Show Gist options
  • Save osyoyu/f41efbab3311182e7f7fd5c8d302e96a to your computer and use it in GitHub Desktop.
Save osyoyu/f41efbab3311182e7f7fd5c8d302e96a to your computer and use it in GitHub Desktop.
saikoh.tk benchmarker
package main
import (
"flag"
"log"
"net/url"
"sync"
"time"
"github.com/gorilla/websocket"
)
func sendSaikoh(c *websocket.Conn, mode string) error {
var msg []byte
switch mode {
case "saikohtk":
msg = []byte("{\"type\":\"incr\",\"data\":{\"name\":\"emoi\"}}")
case "moon20x":
msg = []byte("")
default:
log.Fatal("Unknown mode")
}
err := c.WriteMessage(websocket.TextMessage, msg)
if err != nil {
// log.Println("write:", err)
return err
}
return nil
}
func fuka(host string, timeout time.Duration, mode string) int {
// Connect
url := url.URL{Scheme: "ws", Host: host, Path: "/api/websocket"}
conn, _, err := websocket.DefaultDialer.Dial(url.String(), nil)
if err != nil {
log.Fatal(err)
}
defer conn.Close()
// go func() {
// for {
// _, _, err := c.ReadMessage()
// if err != nil {
// return
// }
// }
// }()
c := make(chan int, 1)
cnt := 0
go func() {
for {
cnt++
err := sendSaikoh(conn, mode)
if err != nil {
log.Print(err)
return
}
}
}()
// Run for <timeout> seconds
select {
case _ = <-c:
// use err and reply
case <-time.After(timeout): // milliseconds
}
log.Printf("Sent %d messages", cnt)
return cnt
}
func main() {
var (
host = flag.String("host", "localhost:9292", "saikoh.tk host")
conc = flag.Int("c", 1, "concurrency")
t = flag.Float64("t", 1, "seconds")
dur = time.Duration(*t * 1000 * 1000 * 1000)
mode = flag.String("mode", "saikohtk", "mode")
)
flag.Parse()
var wg sync.WaitGroup
for i := 0; i < *conc; i++ {
wg.Add(1)
go func() {
defer wg.Done()
fuka(*host, dur, *mode)
}()
}
log.Printf("Spawned %d user(s), running for %.1f seconds each\n", *conc, *t)
wg.Wait()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment