Skip to content

Instantly share code, notes, and snippets.

@joeke80215
Last active February 25, 2019 05:08
Show Gist options
  • Save joeke80215/5baacbfda4c8a2f343822187a9b2601a to your computer and use it in GitHub Desktop.
Save joeke80215/5baacbfda4c8a2f343822187a9b2601a to your computer and use it in GitHub Desktop.
Golang http atomic vs mutex
package main
import (
"log"
"net/http"
"sync/atomic"
)
type redirector struct {
counter uint32
}
func (r *redirector) handleRedir(w http.ResponseWriter, req *http.Request) {
w.Write([]byte("OK"))
atomic.AddUint32(&r.counter, 1)
}
func main() {
redr := &redirector{counter: 0}
http.HandleFunc("/test", redr.handleRedir)
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatal(err)
}
}
/*
==========================BENCHMARK==========================
URL: http://localhost:8080/test
Used Connections: 400
Used Threads: 8
Total number of calls: 100000
===========================TIMINGS===========================
Total time passed: 21.64s
Avg time per request: 84.16ms
Requests per second: 4620.43
Median time per request: 36.00ms
99th percentile time: 632.00ms
Slowest time for request: 2105.00ms
=============================DATA=============================
Total response body sizes: 199770
Avg response body per request: 2.00 Byte
Transfer rate per second: 9230.24 Byte/s (0.01 MByte/s)
==========================RESPONSES==========================
20X Responses: 99885 (99.89%)
30X Responses: 0 (0.00%)
40X Responses: 0 (0.00%)
50X Responses: 0 (0.00%)
Errors: 115 (0.11%)
*/
package main
import (
"log"
"net/http"
"sync"
)
type redirector struct {
counter uint32
sync.Mutex
}
func (r *redirector) handleRedir(w http.ResponseWriter, req *http.Request) {
w.Write([]byte("OK"))
r.Lock()
r.counter++
r.Unlock()
}
func main() {
redr := &redirector{counter: 0}
http.HandleFunc("/test", redr.handleRedir)
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatal(err)
}
}
/*
==========================BENCHMARK==========================
URL: http://localhost:8080/test
Used Connections: 400
Used Threads: 8
Total number of calls: 100000
===========================TIMINGS===========================
Total time passed: 22.66s
Avg time per request: 88.44ms
Requests per second: 4412.28
Median time per request: 37.00ms
99th percentile time: 656.00ms
Slowest time for request: 2109.00ms
=============================DATA=============================
Total response body sizes: 199948
Avg response body per request: 2.00 Byte
Transfer rate per second: 8822.27 Byte/s (0.01 MByte/s)
==========================RESPONSES==========================
20X Responses: 99974 (99.97%)
30X Responses: 0 (0.00%)
40X Responses: 0 (0.00%)
50X Responses: 0 (0.00%)
Errors: 26 (0.03%)
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment