

Golang web frameworks benchmark - maximveksler
https://quip.com/Ha0bAfeh1ZVY

======
jsherer
Genuinely curious, are there any cases of production Go environments where
routing is the bottleneck of their HTTP services? I'd think any kind of data
access in the service would be the bottleneck, not routing.

~~~
VanillaCafe
The way I look at it is composing benchmarks to estimate the upper bound on
the number of pages that can be served per second.

So for GITHUBALL for instance:

* BenchmarkHttpRouter_GithubAll at 66732 ns/op serves at most 15k pages/second/server, versus say

* BenchmarkGoji_GithubAll at 752515 ns/op serves at most 1.3k pages/second/server

Or for GPLUSALL

* BenchmarkHttpRouter_GPlusAll at 3258 ns/op serves at most 310k pages/second/server, versus

* BenchmarkGoji_GPlusAll at 15260 ns/op serves at most 66k pages/second/server

------
falcolas
Silly question, but where's the "plain net/http" benchmark? I haven't found a
case where I've missed having an http framework.

Would be interesting to see what the baseline is.

~~~
maximveksler
Basically there aren’t much reasons besides security considerations to use
net/http multiplexer at all.

The baseline was profiled under STATICALL as the default net/http multiplexer
does not support dynamic paths
[http://golang.org/pkg/net/http/#ServeMux](http://golang.org/pkg/net/http/#ServeMux).
The benchmark is named BenchmarkHttpServeMux_StaticAll you can read the code
at [https://github.com/julienschmidt/go-http-routing-
benchmark/b...](https://github.com/julienschmidt/go-http-routing-
benchmark/blob/master/static_test.go#L204). Frankly, net/http it not a very
good http router. The results show that julienschmidt/httprouter trie based
implementing outperforms net/http by 60x.

------
Yadi
I know this is a dumb question, but is there a conclusion to the benchmarks
that which one would be more ideal to use?

I'm just learning GO, that is why I'm asking.

~~~
Zikes
I think the tl;dr at the top of the page answers that the best:

    
    
        HttpRouter is the king of performance, scoring first on ALL tests. 
        2nd place goes to ace if you don’t need middleware, and Gin if you do. 
        3rd place goes to Goji which is mature, stable and all things considered awesome.

~~~
Yadi
Thanks!

------
Inflatablewoman
Very interesting. Thanks for posting this. I have been using TigerTonic, but
will give Gin a go after reading this.

~~~
maximveksler
I hope to not disappoint you, or us as a matter of fact :) hit us up on
@hellodebug we will be building this open sourced.

------
ch4s3
Wow, I knew Gin was supposed to be faster than martini, but seeing that large
of a spread was pretty interesting.

~~~
beckler
Not totally sure, but I think Gin is faster because it uses HttpRouter under
the covers.

~~~
dougbarrett
And httprouter is a bit limited as far as what you can do with the url rules,
understadibly. I've documented it here:

[https://www.dougcodes.com/go-lang/gin-gonic-may-
be-40x-faste...](https://www.dougcodes.com/go-lang/gin-gonic-may-
be-40x-faster-than-martini-but-it-is-not-better)

and here:

[https://www.dougcodes.com/go-lang/martini-to-gin-back-to-
mar...](https://www.dougcodes.com/go-lang/martini-to-gin-back-to-martini-and-
on-to-negroni-and-mux)

Negroni/Gorilla Mux seems to be a good combination for me, but Jeremy Saenz is
coming out with a new mux that I'm interested in trying when it's released to
see how it compares to Gorilla Mux.

------
landr0id
I'm kind of surprised Negroni wasn't among those tested.

~~~
rlbaker
I believe that Negroni is considered a library rather than a framework.
[https://github.com/codegangsta/negroni#is-negroni-a-
framewor...](https://github.com/codegangsta/negroni#is-negroni-a-framework)

But I don't know why that would preclude it from these benchmarks because
httprouter is not a full fledged framework either.

