Coder Social home page Coder Social logo

go-http-routing-benchmark's Introduction

Go HTTP Router Benchmark

This benchmark suite aims to compare the performance of HTTP request routers for Go by implementing the routing structure of some real world APIs. Some of the APIs are slightly adapted, since they can not be implemented 1:1 in some of the routers.

Of course the tested routers can be used for any kind of HTTP request โ†’ handler function routing, not only (REST) APIs.

Tested routers & frameworks:

Motivation

Go is a great language for web applications. Since the default request multiplexer of Go's net/http package is very simple and limited, an accordingly high number of HTTP request routers exist.

Unfortunately, most of the (early) routers use pretty bad routing algorithms. Moreover, many of them are very wasteful with memory allocations, which can become a problem in a language with Garbage Collection like Go, since every (heap) allocation results in more work for the Garbage Collector.

Lately more and more bloated frameworks pop up, outdoing one another in the number of features. This benchmark tries to measure their overhead.

Be aware that we are comparing apples and oranges here. We compare feature-rich frameworks to packages with simple routing functionality only. But since we are only interested in decent request routing, I think this is not entirely unfair. The frameworks are configured to do as little additional work as possible.

If you care about performance, this benchmark can maybe help you find the right router, which scales with your application.

Personally, I prefer slim and optimized software, which is why I implemented HttpRouter, which is also tested here. In fact, this benchmark suite started as part of the packages tests, but was then extended to a generic benchmark suite. So keep in mind, that I am not completely unbiased ๐Ÿ˜Œ

Results

Benchmark System:

  • Intel Core i5-2500K (4x 3,30GHz + Turbo Boost), CPU-governor: performance
  • 2x 4 GiB DDR3-1333 RAM, dual-channel
  • go version go1.3rc1 linux/amd64
  • Ubuntu 14.04 amd64 (Linux Kernel 3.13.0-29), fresh installation

Memory Consumption

Besides the micro-benchmarks, there are 3 sets of benchmarks where we play around with clones of some real-world APIs, and one benchmark with static routes only, to allow a comparison with http.ServeMux. The following table shows the memory required only for loading the routing structure for the respective API. The best 3 values for each test are bold. I'm pretty sure you can detect a pattern ๐Ÿ˜‰

Router Static GitHub Google+ Parse
HttpServeMux 18064 B - - -
Beego 79472 B 497248 B 26480 B 38768 B
Denco 44752 B 107632 B 54896 B 36368 B
Gocraft Web 57976 B 95736 B 8024 B 13120 B
Goji 32400 B 58424 B 3392 B 6704 B
Go-Json-Rest 152608 B 148352 B 11696 B 13712 B
Gorilla Mux 685152 B 1557216 B 80240 B 125480 B
HttpRouter 26232 B 44344 B 3144 B 5792 B
HttpTreeMux 75624 B 81408 B 7712 B 7616 B
Kocha 130336 B 811744 B 139968 B 191632 B
Martini 312592 B 579472 B 27520 B 50608 B
Pat 21272 B 18968 B 1448 B 2360 B
TigerTonic 85264 B 99392 B 10576 B 11008 B
Traffic 649568 B 1124704 B 57984 B 98168 B

The first place goes to Pat, followed by HttpRouter and Goji. Now, before everyone starts reading the documentation of Pat, [SPOILER] this low memory consumption comes at the price of relatively bad routing performance. The routing structure of Pat is simple - probably too simple. [/SPOILER].

Moreover main memory is cheap and usually not a scarce resource. As long as the router doesn't require Megabytes of memory, it should be no deal breaker. But it gives us a first hint how efficient or wasteful a router works.

Static Routes

The Static benchmark is not really a clone of a real-world API. It is just a collection of random static paths inspired by the structure of the Go directory. It might not be a realistic URL-structure.

The only intention of this benchmark is to allow a comparison with the default router of Go's net/http package, http.ServeMux, which is limited to static routes and does not support parameters in the route pattern.

In the StaticAll benchmark each of 157 URLs is called once per repetition (op, operation). If you are unfamiliar with the go test -bench tool, the first number is the number of repetitions the go test tool made, to get a test running long enough for measurements. The second column shows the time in nanoseconds that a single repetition takes. The third number is the amount of heap memory allocated in bytes, the last one the average number of allocations made per repetition.

The logs below show, that http.ServeMux has only medium performance, compared to more feature-rich routers. The fastest router only needs 1.8% of the time http.ServeMux needs.

HttpRouter was the first router (I know of) that managed to serve all the static URLs without a single heap allocation. Since the first run of this benchmark more routers followed this trend and were optimized in the same way.

BenchmarkHttpServeMux_StaticAll         5000     706222 ns/op          96 B/op        6 allocs/op

BenchmarkBeego_StaticAll                2000    1408954 ns/op      482433 B/op    14088 allocs/op
BenchmarkDenco_StaticAll              200000      12679 ns/op           0 B/op        0 allocs/op
BenchmarkGocraftWeb_StaticAll          10000     154142 ns/op       51468 B/op      947 allocs/op
BenchmarkGoji_StaticAll                20000      80518 ns/op           0 B/op        0 allocs/op
BenchmarkGoJsonRest_StaticAll           2000     978164 ns/op      180973 B/op     3945 allocs/op
BenchmarkGorillaMux_StaticAll           1000    1763690 ns/op       71804 B/op      956 allocs/op
BenchmarkHttpRouter_StaticAll         100000      15010 ns/op           0 B/op        0 allocs/op
BenchmarkHttpTreeMux_StaticAll        100000      15123 ns/op           0 B/op        0 allocs/op
BenchmarkKocha_StaticAll              100000      23093 ns/op           0 B/op        0 allocs/op
BenchmarkMartini_StaticAll               500    3444278 ns/op      156015 B/op     2351 allocs/op
BenchmarkPat_StaticAll                  1000    1640745 ns/op      549187 B/op    11186 allocs/op
BenchmarkTigerTonic_StaticAll          50000      58264 ns/op        7714 B/op      157 allocs/op
BenchmarkTraffic_StaticAll               500    7230129 ns/op     3763731 B/op    27453 allocs/op

Micro Benchmarks

The following benchmarks measure the cost of some very basic operations.

In the first benchmark, only a single route, containing a parameter, is loaded into the routers. Then a request for a URL matching this pattern is made and the router has to call the respective registered handler function. End.

BenchmarkBeego_Param                  500000       5495 ns/op        1165 B/op       14 allocs/op
BenchmarkDenco_Param                 5000000        312 ns/op          50 B/op        2 allocs/op
BenchmarkGocraftWeb_Param            1000000       1440 ns/op         684 B/op        9 allocs/op
BenchmarkGoji_Param                  5000000        748 ns/op         340 B/op        2 allocs/op
BenchmarkGoJsonRest_Param             500000       6980 ns/op        1787 B/op       29 allocs/op
BenchmarkGorillaMux_Param            1000000       2665 ns/op         780 B/op        7 allocs/op
BenchmarkHttpRouter_Param           20000000        139 ns/op          33 B/op        1 allocs/op
BenchmarkHttpTreeMux_Param           5000000        558 ns/op         340 B/op        2 allocs/op
BenchmarkKocha_Param                 5000000        377 ns/op          58 B/op        2 allocs/op
BenchmarkMartini_Param                500000       6265 ns/op        1251 B/op       12 allocs/op
BenchmarkPat_Param                   1000000       1620 ns/op         670 B/op       11 allocs/op
BenchmarkTigerTonic_Param            1000000       2766 ns/op        1015 B/op       18 allocs/op
BenchmarkTraffic_Param                500000       4440 ns/op        2013 B/op       22 allocs/op

Same as before, but now with multiple parameters, all in the same single route. The intention is to see how the routers scale with the number of parameters. The values of the parameters must be passed to the handler function somehow, which requires allocations. Let's see how clever the routers solve this task with a route containing 5 and 20 parameters:

BenchmarkBeego_Param5                 100000      18473 ns/op        1291 B/op       14 allocs/op
BenchmarkDenco_Param5                2000000        982 ns/op         405 B/op        5 allocs/op
BenchmarkGocraftWeb_Param5           1000000       2218 ns/op         957 B/op       12 allocs/op
BenchmarkGoji_Param5                 1000000       1093 ns/op         340 B/op        2 allocs/op
BenchmarkGoJsonRest_Param5            200000      10462 ns/op        3264 B/op       40 allocs/op
BenchmarkGorillaMux_Param5            500000       4680 ns/op         906 B/op        7 allocs/op
BenchmarkHttpRouter_Param5           5000000        319 ns/op         162 B/op        1 allocs/op
BenchmarkHttpTreeMux_Param5          2000000        898 ns/op         340 B/op        2 allocs/op
BenchmarkKocha_Param5                1000000       1326 ns/op         448 B/op        7 allocs/op
BenchmarkMartini_Param5               200000      13027 ns/op        1376 B/op       12 allocs/op
BenchmarkPat_Param5                   500000       3416 ns/op        1435 B/op       18 allocs/op
BenchmarkTigerTonic_Param5            200000       9247 ns/op        2568 B/op       41 allocs/op
BenchmarkTraffic_Param5               500000       7206 ns/op        2312 B/op       26 allocs/op

BenchmarkBeego_Param20                 10000     106746 ns/op        3681 B/op       17 allocs/op
BenchmarkDenco_Param20               1000000       2882 ns/op        1666 B/op        7 allocs/op
BenchmarkGocraftWeb_Param20           500000       7156 ns/op        3857 B/op       16 allocs/op
BenchmarkGoji_Param20                1000000       3197 ns/op        1260 B/op        2 allocs/op
BenchmarkGoJsonRest_Param20           100000      25809 ns/op       10605 B/op       75 allocs/op
BenchmarkGorillaMux_Param20           200000       9885 ns/op        3295 B/op        9 allocs/op
BenchmarkHttpRouter_Param20          2000000        954 ns/op         646 B/op        1 allocs/op
BenchmarkHttpTreeMux_Param20          500000       5016 ns/op        2216 B/op        4 allocs/op
BenchmarkKocha_Param20                500000       4268 ns/op        1836 B/op       17 allocs/op
BenchmarkMartini_Param20               50000      55039 ns/op        3765 B/op       14 allocs/op
BenchmarkPat_Param20                  500000       3412 ns/op        1435 B/op       18 allocs/op
BenchmarkTigerTonic_Param20            50000      36825 ns/op       10710 B/op      131 allocs/op
BenchmarkTraffic_Param20              100000      22605 ns/op        8077 B/op       49 allocs/op

Now let's see how expensive it is to access a parameter. The handler function reads the value (by the name of the parameter, e.g. with a map lookup; depends on the router) and writes it to our web scale storage (/dev/null).

BenchmarkBeego_ParamWrite             500000       6604 ns/op        1602 B/op       18 allocs/op
BenchmarkDenco_ParamWrite            5000000        377 ns/op          50 B/op        2 allocs/op
BenchmarkGocraftWeb_ParamWrite       1000000       1590 ns/op         693 B/op        9 allocs/op
BenchmarkGoji_ParamWrite             2000000        818 ns/op         340 B/op        2 allocs/op
BenchmarkGoJsonRest_ParamWrite        200000       8388 ns/op        2265 B/op       33 allocs/op
BenchmarkGorillaMux_ParamWrite       1000000       2913 ns/op         780 B/op        7 allocs/op
BenchmarkHttpRouter_ParamWrite      10000000        193 ns/op          33 B/op        1 allocs/op
BenchmarkHttpTreeMux_ParamWrite      5000000        649 ns/op         340 B/op        2 allocs/op
BenchmarkKocha_ParamWrite            5000000        435 ns/op          58 B/op        2 allocs/op
BenchmarkMartini_ParamWrite           500000       7538 ns/op        1359 B/op       15 allocs/op
BenchmarkPat_ParamWrite              1000000       2940 ns/op        1109 B/op       15 allocs/op
BenchmarkTigerTonic_ParamWrite        500000       4639 ns/op        1471 B/op       23 allocs/op
BenchmarkTraffic_ParamWrite           500000       5855 ns/op        2435 B/op       25 allocs/op

Enough of the micro benchmark stuff. Let's play a bit with real APIs. In the first set of benchmarks, we use a clone of the structure of Parse's decent medium-sized REST API, consisting of 26 routes.

The tasks are 1.) routing a static URL (no parameters), 2.) routing a URL containing 1 parameter, 3.) same with 2 parameters, 4.) route all of the routes once (like the StaticAll benchmark, but the routes now contain parameters).

Worth noting is, that the requested route might be a good case for some routing algorithms, while it is a bad case for another algorithm. The values might vary slightly depending on the selected route.

BenchmarkBeego_ParseStatic            500000       3461 ns/op        1247 B/op       15 allocs/op
BenchmarkDenco_ParseStatic          50000000         42.6 ns/op         0 B/op        0 allocs/op
BenchmarkGocraftWeb_ParseStatic      2000000        889 ns/op         328 B/op        6 allocs/op
BenchmarkGoji_ParseStatic            5000000        341 ns/op           0 B/op        0 allocs/op
BenchmarkGoJsonRest_ParseStatic       500000       5860 ns/op        1136 B/op       25 allocs/op
BenchmarkGorillaMux_ParseStatic      1000000       2760 ns/op         456 B/op        6 allocs/op
BenchmarkHttpRouter_ParseStatic     50000000         36.7 ns/op         0 B/op        0 allocs/op
BenchmarkHttpTreeMux_ParseStatic    50000000         62.6 ns/op         0 B/op        0 allocs/op
BenchmarkKocha_ParseStatic          50000000         72.2 ns/op         0 B/op        0 allocs/op
BenchmarkMartini_ParseStatic          500000       5528 ns/op         927 B/op       11 allocs/op
BenchmarkPat_ParseStatic             2000000        809 ns/op         246 B/op        5 allocs/op
BenchmarkTigerTonic_ParseStatic     10000000        264 ns/op          49 B/op        1 allocs/op
BenchmarkTraffic_ParseStatic          500000       5008 ns/op        2377 B/op       24 allocs/op

BenchmarkBeego_ParseParam             500000       7983 ns/op        1775 B/op       28 allocs/op
BenchmarkDenco_ParseParam            5000000        347 ns/op          50 B/op        2 allocs/op
BenchmarkGocraftWeb_ParseParam       1000000       1535 ns/op         700 B/op        9 allocs/op
BenchmarkGoji_ParseParam             2000000        983 ns/op         340 B/op        2 allocs/op
BenchmarkGoJsonRest_ParseParam        500000       7208 ns/op        1789 B/op       29 allocs/op
BenchmarkGorillaMux_ParseParam       1000000       3186 ns/op         780 B/op        7 allocs/op
BenchmarkHttpRouter_ParseParam      10000000        178 ns/op          65 B/op        1 allocs/op
BenchmarkHttpTreeMux_ParseParam      5000000        617 ns/op         340 B/op        2 allocs/op
BenchmarkKocha_ParseParam            5000000        413 ns/op          58 B/op        2 allocs/op
BenchmarkMartini_ParseParam           500000       7524 ns/op        1251 B/op       12 allocs/op
BenchmarkPat_ParseParam              1000000       2707 ns/op        1160 B/op       18 allocs/op
BenchmarkTigerTonic_ParseParam       1000000       3010 ns/op        1048 B/op       19 allocs/op
BenchmarkTraffic_ParseParam           500000       5228 ns/op        2314 B/op       24 allocs/op

BenchmarkBeego_Parse2Params           200000       9217 ns/op        1935 B/op       28 allocs/op
BenchmarkDenco_Parse2Params          5000000        542 ns/op         115 B/op        3 allocs/op
BenchmarkGocraftWeb_Parse2Params     1000000       1756 ns/op         750 B/op       10 allocs/op
BenchmarkGoji_Parse2Params           2000000        954 ns/op         340 B/op        2 allocs/op
BenchmarkGoJsonRest_Parse2Params      500000       8131 ns/op        2145 B/op       32 allocs/op
BenchmarkGorillaMux_Parse2Params      500000       3623 ns/op         812 B/op        7 allocs/op
BenchmarkHttpRouter_Parse2Params    10000000        202 ns/op          65 B/op        1 allocs/op
BenchmarkHttpTreeMux_Parse2Params    5000000        708 ns/op         340 B/op        2 allocs/op
BenchmarkKocha_Parse2Params          5000000        666 ns/op         132 B/op        4 allocs/op
BenchmarkMartini_Parse2Params         200000       7723 ns/op        1283 B/op       12 allocs/op
BenchmarkPat_Parse2Params            1000000       2687 ns/op         887 B/op       19 allocs/op
BenchmarkTigerTonic_Parse2Params      500000       4720 ns/op        1473 B/op       28 allocs/op
BenchmarkTraffic_Parse2Params         500000       5467 ns/op        2120 B/op       24 allocs/op

BenchmarkBeego_ParseAll                10000     197920 ns/op       38877 B/op      616 allocs/op
BenchmarkDenco_ParseAll               500000       7692 ns/op        1000 B/op       35 allocs/op
BenchmarkGocraftWeb_ParseAll           50000      36226 ns/op       14639 B/op      208 allocs/op
BenchmarkGoji_ParseAll                100000      19721 ns/op        5448 B/op       32 allocs/op
BenchmarkGoJsonRest_ParseAll           10000     180128 ns/op       41202 B/op      727 allocs/op
BenchmarkGorillaMux_ParseAll           10000     120929 ns/op       17138 B/op      173 allocs/op
BenchmarkHttpRouter_ParseAll          500000       3592 ns/op         660 B/op       16 allocs/op
BenchmarkHttpTreeMux_ParseAll         200000      11650 ns/op        5452 B/op       32 allocs/op
BenchmarkKocha_ParseAll               200000       9371 ns/op        1163 B/op       44 allocs/op
BenchmarkMartini_ParseAll              10000     200307 ns/op       29375 B/op      305 allocs/op
BenchmarkPat_ParseAll                  50000      53113 ns/op       18017 B/op      363 allocs/op
BenchmarkTigerTonic_ParseAll           50000      67208 ns/op       20547 B/op      419 allocs/op
BenchmarkTraffic_ParseAll              10000     164938 ns/op       70161 B/op      743 allocs/op

The GitHub API is rather large, consisting of 203 routes. The tasks are basically the same as in the benchmarks before.

BenchmarkBeego_GithubStatic           500000       3880 ns/op        1148 B/op       31 allocs/op
BenchmarkDenco_GithubStatic         50000000         60.5 ns/op         0 B/op        0 allocs/op
BenchmarkGocraftWeb_GithubStatic     2000000        933 ns/op         328 B/op        6 allocs/op
BenchmarkGoji_GithubStatic           5000000        401 ns/op           0 B/op        0 allocs/op
BenchmarkGoJsonRest_GithubStatic      500000       6006 ns/op        1150 B/op       25 allocs/op
BenchmarkGorillaMux_GithubStatic      100000      18227 ns/op         456 B/op        6 allocs/op
BenchmarkHttpRouter_GithubStatic    50000000         63.2 ns/op         0 B/op        0 allocs/op
BenchmarkHttpTreeMux_GithubStatic   50000000         65.1 ns/op         0 B/op        0 allocs/op
BenchmarkKocha_GithubStatic         20000000         99.5 ns/op         0 B/op        0 allocs/op
BenchmarkMartini_GithubStatic         100000      18546 ns/op         927 B/op       11 allocs/op
BenchmarkPat_GithubStatic             200000      11503 ns/op        3754 B/op       76 allocs/op
BenchmarkTigerTonic_GithubStatic     5000000        308 ns/op          49 B/op        1 allocs/op
BenchmarkTraffic_GithubStatic          50000      44923 ns/op       23105 B/op      168 allocs/op

BenchmarkBeego_GithubParam             50000      44645 ns/op        2973 B/op       50 allocs/op
BenchmarkDenco_GithubParam           5000000        643 ns/op         115 B/op        3 allocs/op
BenchmarkGocraftWeb_GithubParam      1000000       1855 ns/op         750 B/op       10 allocs/op
BenchmarkGoji_GithubParam            1000000       1314 ns/op         340 B/op        2 allocs/op
BenchmarkGoJsonRest_GithubParam       200000       8427 ns/op        2159 B/op       32 allocs/op
BenchmarkGorillaMux_GithubParam       200000      11485 ns/op         813 B/op        7 allocs/op
BenchmarkHttpRouter_GithubParam      5000000        304 ns/op          97 B/op        1 allocs/op
BenchmarkHttpTreeMux_GithubParam     2000000        770 ns/op         340 B/op        2 allocs/op
BenchmarkKocha_GithubParam           5000000        754 ns/op         132 B/op        4 allocs/op
BenchmarkMartini_GithubParam          100000      22637 ns/op        1284 B/op       12 allocs/op
BenchmarkPat_GithubParam              500000       7319 ns/op        2538 B/op       44 allocs/op
BenchmarkTigerTonic_GithubParam       500000       4722 ns/op        1467 B/op       26 allocs/op
BenchmarkTraffic_GithubParam          100000      18700 ns/op        7076 B/op       58 allocs/op

BenchmarkBeego_GithubAll                 100   23430165 ns/op      502614 B/op     9871 allocs/op
BenchmarkDenco_GithubAll               10000     120365 ns/op       21219 B/op      506 allocs/op
BenchmarkGocraftWeb_GithubAll           5000     358982 ns/op      139091 B/op     1903 allocs/op
BenchmarkGoji_GithubAll                 5000     604522 ns/op       56896 B/op      340 allocs/op
BenchmarkGoJsonRest_GithubAll           1000    1645794 ns/op      404222 B/op     6303 allocs/op
BenchmarkGorillaMux_GithubAll            500    6634737 ns/op      152277 B/op     1402 allocs/op
BenchmarkHttpRouter_GithubAll          50000      51138 ns/op       14039 B/op      168 allocs/op
BenchmarkHttpTreeMux_GithubAll         10000     132507 ns/op       56907 B/op      340 allocs/op
BenchmarkKocha_GithubAll               10000     143398 ns/op       24117 B/op      676 allocs/op
BenchmarkMartini_GithubAll               200    9802351 ns/op      258349 B/op     2713 allocs/op
BenchmarkPat_GithubAll                   500    4154815 ns/op     1539081 B/op    24970 allocs/op
BenchmarkTigerTonic_GithubAll           2000     920839 ns/op      247085 B/op     5171 allocs/op
BenchmarkTraffic_GithubAll               200    8087393 ns/op     3143039 B/op    23958 allocs/op

Last but not least the Google+ API, consisting of 13 routes. In reality this is just a subset of a much larger API.

BenchmarkBeego_GPlusStatic           1000000       2321 ns/op         808 B/op       11 allocs/op
BenchmarkDenco_GPlusStatic          50000000         37.2 ns/op         0 B/op        0 allocs/op
BenchmarkGocraftWeb_GPlusStatic      2000000        862 ns/op         312 B/op        6 allocs/op
BenchmarkGoji_GPlusStatic           10000000        270 ns/op           0 B/op        0 allocs/op
BenchmarkGoJsonRest_GPlusStatic       500000       5827 ns/op        1136 B/op       25 allocs/op
BenchmarkGorillaMux_GPlusStatic      1000000       1793 ns/op         456 B/op        6 allocs/op
BenchmarkHttpRouter_GPlusStatic     50000000         34.6 ns/op         0 B/op        0 allocs/op
BenchmarkHttpTreeMux_GPlusStatic    50000000         35.4 ns/op         0 B/op        0 allocs/op
BenchmarkKocha_GPlusStatic          50000000         63.8 ns/op         0 B/op        0 allocs/op
BenchmarkMartini_GPlusStatic          500000       4887 ns/op         927 B/op       11 allocs/op
BenchmarkPat_GPlusStatic             5000000        336 ns/op          98 B/op        2 allocs/op
BenchmarkTigerTonic_GPlusStatic     10000000        186 ns/op          33 B/op        1 allocs/op
BenchmarkTraffic_GPlusStatic          500000       3350 ns/op        1503 B/op       18 allocs/op

BenchmarkBeego_GPlusParam             200000       7657 ns/op        1231 B/op       16 allocs/op
BenchmarkDenco_GPlusParam            5000000        365 ns/op          50 B/op        2 allocs/op
BenchmarkGocraftWeb_GPlusParam       1000000       1519 ns/op         684 B/op        9 allocs/op
BenchmarkGoji_GPlusParam             2000000        889 ns/op         340 B/op        2 allocs/op
BenchmarkGoJsonRest_GPlusParam        500000       7388 ns/op        1806 B/op       29 allocs/op
BenchmarkGorillaMux_GPlusParam        500000       4040 ns/op         780 B/op        7 allocs/op
BenchmarkHttpRouter_GPlusParam      10000000        203 ns/op          65 B/op        1 allocs/op
BenchmarkHttpTreeMux_GPlusParam      5000000        638 ns/op         340 B/op        2 allocs/op
BenchmarkKocha_GPlusParam            5000000        444 ns/op          58 B/op        2 allocs/op
BenchmarkMartini_GPlusParam           200000       8672 ns/op        1251 B/op       12 allocs/op
BenchmarkPat_GPlusParam              1000000       1895 ns/op         719 B/op       12 allocs/op
BenchmarkTigerTonic_GPlusParam       1000000       3166 ns/op        1085 B/op       18 allocs/op
BenchmarkTraffic_GPlusParam           500000       5369 ns/op        2030 B/op       22 allocs/op

BenchmarkBeego_GPlus2Params           200000       9999 ns/op        1293 B/op       16 allocs/op
BenchmarkDenco_GPlus2Params          5000000        618 ns/op         115 B/op        3 allocs/op
BenchmarkGocraftWeb_GPlus2Params     1000000       1860 ns/op         750 B/op       10 allocs/op
BenchmarkGoji_GPlus2Params           1000000       1296 ns/op         340 B/op        2 allocs/op
BenchmarkGoJsonRest_GPlus2Params      200000       8516 ns/op        2178 B/op       32 allocs/op
BenchmarkGorillaMux_GPlus2Params      200000       9007 ns/op         812 B/op        7 allocs/op
BenchmarkHttpRouter_GPlus2Params    10000000        246 ns/op          65 B/op        1 allocs/op
BenchmarkHttpTreeMux_GPlus2Params    2000000        751 ns/op         340 B/op        2 allocs/op
BenchmarkKocha_GPlus2Params          5000000        744 ns/op         132 B/op        4 allocs/op
BenchmarkMartini_GPlus2Params         100000      27700 ns/op        1382 B/op       16 allocs/op
BenchmarkPat_GPlus2Params             500000       5981 ns/op        2347 B/op       34 allocs/op
BenchmarkTigerTonic_GPlus2Params      500000       5076 ns/op        1561 B/op       27 allocs/op
BenchmarkTraffic_GPlus2Params         200000      12711 ns/op        3599 B/op       34 allocs/op

BenchmarkBeego_GPlusAll                10000     113601 ns/op       15897 B/op      217 allocs/op
BenchmarkDenco_GPlusAll               500000       5761 ns/op         880 B/op       27 allocs/op
BenchmarkGocraftWeb_GPlusAll          100000      20527 ns/op        8513 B/op      116 allocs/op
BenchmarkGoji_GPlusAll                200000      12312 ns/op        3746 B/op       22 allocs/op
BenchmarkGoJsonRest_GPlusAll           20000      99250 ns/op       23871 B/op      386 allocs/op
BenchmarkGorillaMux_GPlusAll           50000      63046 ns/op        9655 B/op       90 allocs/op
BenchmarkHttpRouter_GPlusAll         1000000       2513 ns/op         655 B/op       11 allocs/op
BenchmarkHttpTreeMux_GPlusAll         500000       7706 ns/op        3748 B/op       22 allocs/op
BenchmarkKocha_GPlusAll               500000       6858 ns/op        1017 B/op       35 allocs/op
BenchmarkMartini_GPlusAll              10000     155402 ns/op       16368 B/op      179 allocs/op
BenchmarkPat_GPlusAll                  50000      47397 ns/op       17270 B/op      302 allocs/op
BenchmarkTigerTonic_GPlusAll           50000      49864 ns/op       15160 B/op      311 allocs/op
BenchmarkTraffic_GPlusAll              10000     108007 ns/op       41779 B/op      430 allocs/op

Conclusions

First of all, there is no reason to use net/http's default ServeMux, which is very limited and does not have especially good performance. There are enough alternatives coming in every flavor, choose the one you like best.

Secondly, the broad range of functions of some of the frameworks comes at a high price in terms of performance. For example Martini has great flexibility, but very bad performance. Martini has the worst performance of all tested routers in a lot of the benchmarks. Beego seems to have some scalability problems and easily defeats Martini with even worse performance, when the number of parameters or routes is high. I really hope, that the routing of these packages can be optimized. I think the Go-ecosystem needs great feature-rich frameworks like these.

Last but not least, we have to determine the performance champion.

Denco and its predecessor Kocha-urlrouter seem to have great performance, but are not convenient to use as a router for the net/http package. A lot of extra work is necessary to use it as a http.Handler. The README of Denco claims, that the package is not intended as a replacement for http.ServeMux.

Goji looks very decent. It has great performance while also having a great range of features, more than any other router / framework in the top group.

Currently no router can beat the performance of the HttpRouter package, which currently dominates nearly all benchmarks.

In the end, performance can not be the (only) criterion for choosing a router. Play around a bit with some of the routers, and choose the one you like best.

Usage

If you'd like to run these benchmarks locally, you'll need to install the package first:

go get github.com/julienschmidt/go-http-routing-benchmark

This may take a while due to the large number of dependencies that need to be downloaded. Once that command has finished you can run the full set of benchmarks like this:

cd $GOPATH/src/github.com/julienschmidt/go-http-routing-benchmark
go test -bench=.

Note: If you run the tests and it SIGQUIT's make the go test timeout longer (#44)

go test -timeout=2h -bench=.

You can bench specific frameworks only by using a regular expression as the value of the bench parameter:

go test -bench="Martini|Gin|HttpMux"

go-http-routing-benchmark's People

Contributors

achun avatar afshin avatar akyoto avatar ant0ine avatar appleboy avatar astaxie avatar attilaolah avatar bwinterton avatar chrisportela avatar cobomi avatar deankarn avatar dimfeld avatar epipho avatar jbuberel avatar julienschmidt avatar klizhentas avatar laher avatar lunny avatar manucorporat avatar marius92mc avatar mikespook avatar naoina avatar pratikdeoghare avatar syscrusher avatar unknwon avatar vanng822 avatar vishr avatar zenazn avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

go-http-routing-benchmark's Issues

Please consider vendor or regular dependency updates

I'm trying to run benchmarks from the last commit (2b13695).

Using Go 1.8 and all fresh dependencies, I'm seeing lots of build problems.

  • The project github.com/Unknwon/macaron doesn't build. That repo is deprecated and now located at github.com/go-macaron/macaron.
  • The latest echo package has signature changes.
  • The latest gojiv2 also has other problems.

Ideally, a process would regularly update all dependencies to ensure that everything still works.

Barring that, capturing the current dependencies in vendor would allow me to recreate your exact setup.

Regular updates that are captured in vendor would be sweet.

Bear benchmark triggers panic

Somehow the bear test gets a nil request passed. When I dump the requests the last several tests are the following:

&{POST /1/events/:eventName HTTP/1.1 1 1 map[] <nil> 0 [] false  map[] map[] <nil> map[]  /1/events/:eventName <nil> <nil>}
&{POST /1/push HTTP/1.1 1 1 map[] <nil> 0 [] false  map[] map[] <nil> map[]  /1/push <nil> <nil>}
&{POST /1/installations HTTP/1.1 1 1 map[] <nil> 0 [] false  map[] map[] <nil> map[]  /1/installations <nil> <nil>}
&{GET /1/installations/:objectId HTTP/1.1 1 1 map[] <nil> 0 [] false  map[] map[] <nil> map[]  /1/installations/:objectId <nil> <nil>}
&{PUT /1/installations/:objectId HTTP/1.1 1 1 map[] <nil> 0 [] false  map[] map[] <nil> map[]  /1/installations/:objectId <nil> <nil>}
&{GET /1/installations HTTP/1.1 1 1 map[] <nil> 0 [] false  map[] map[] <nil> map[]  /1/installations <nil> <nil>}
&{DELETE /1/installations/:objectId HTTP/1.1 1 1 map[] <nil> 0 [] false  map[] map[] <nil> map[]  /1/installations/:objectId <nil> <nil>}
&{POST /1/functions HTTP/1.1 1 1 map[] <nil> 0 [] false  map[] map[] <nil> map[]  /1/functions <nil> <nil>}
<nil>
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
    panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x0 pc=0x489482]

goroutine 8 [running]:
testing.tRunner.func1(0xc82008a000)
    /usr/local/go/src/testing/testing.go:450 +0x171
github.com/julienschmidt/go-http-routing-benchmark.bearHandlerTest(0x0, 0x0, 0x0, 0xc8202cb4c0)
    /data01/dev/src/github.com/julienschmidt/go-http-routing-benchmark/routers.go:144 +0x1a2
github.com/ursiform/bear.(*Context).Next(0xc8202cb4c0)
    /data01/dev/src/github.com/ursiform/bear/context.go:48 +0x11e
github.com/ursiform/bear.(*Mux).ServeHTTP(0xc8202b64e0, 0x7fb2acef7e08, 0xc8202cc420, 0xc82010a380)
    /data01/dev/src/github.com/ursiform/bear/mux.go:138 +0x19d
github.com/julienschmidt/go-http-routing-benchmark.TestRouters(0xc82008a000)
    /data01/dev/src/github.com/julienschmidt/go-http-routing-benchmark/routers_test.go:73 +0x52a
testing.tRunner(0xc82008a000, 0x10f3620)
    /usr/local/go/src/testing/testing.go:456 +0x98
created by testing.RunTests
    /usr/local/go/src/testing/testing.go:561 +0x86d

goroutine 1 [chan receive]:
testing.RunTests(0xe47108, 0x10f3620, 0x1, 0x1, 0x42ca01)
    /usr/local/go/src/testing/testing.go:562 +0x8ad
testing.(*M).Run(0xc820167ee8, 0x0)
    /usr/local/go/src/testing/testing.go:494 +0x70
main.main()
    github.com/julienschmidt/go-http-routing-benchmark/_test/_testmain.go:888 +0x116

goroutine 17 [syscall, locked to thread]:
runtime.goexit()
    /usr/local/go/src/runtime/asm_amd64.s:1696 +0x1

goroutine 5 [syscall]:
os/signal.loop()
    /usr/local/go/src/os/signal/signal_unix.go:22 +0x18
created by os/signal.init.1
    /usr/local/go/src/os/signal/signal_unix.go:28 +0x37
exit status 2
FAIL    github.com/julienschmidt/go-http-routing-benchmark  0.044s

Can't compile

github.com/julienschmidt/go-http-routing-benchmark

./routers.go:338: c.Response undefined (type *echo.Context is pointer to interface, not interface)
./routers.go:338: c.Param undefined (type *echo.Context is pointer to interface, not interface)
./routers.go:343: c.Response undefined (type *echo.Context is pointer to interface, not interface)
./routers.go:343: c.Request undefined (type *echo.Context is pointer to interface, not interface)
./routers.go:357: cannot use h (type interface {}) as type echo.HandlerFunc in argument to e.Get: need type assertion
./routers.go:359: cannot use h (type interface {}) as type echo.HandlerFunc in argument to e.Post: need type assertion
./routers.go:361: cannot use h (type interface {}) as type echo.HandlerFunc in argument to e.Put: need type assertion
./routers.go:363: cannot use h (type interface {}) as type echo.HandlerFunc in argument to e.Patch: need type assertion
./routers.go:365: cannot use h (type interface {}) as type echo.HandlerFunc in argument to e.Delete: need type assertion
./routers.go:370: cannot use e (type *echo.Echo) as type http.Handler in return argument:
*echo.Echo does not implement http.Handler (wrong type for ServeHTTP method)
have ServeHTTP(engine.Request, engine.Response)
want ServeHTTP(http.ResponseWriter, *http.Request)
./routers.go:370: too many errors

It is fair to adjust URLs?

I have idea to make a router based on hashtable. There is only one problem, how to distinguish parameters and 'static' elements in real paths (eg. in /github.com/julienschmidt/go-http-routing-benchmark/issues/new params are emphasized, rest is static).

There is simple solution, prefix each param with colon in real URL ( /github.com/:julienschmidt/:go-http-routing-benchmark/issues/new ) - it is only a little bit more verbose, but has nice computional properties :)

Do you (or any competiotor?) consider using this as a cheat in competition with other routing implementations?

Next round of the benchmark

hi, @julienschmidt

I have test you code in my local. the bench is much better.

  1. your code is the old version. so I change the code in my local.
  2. I test local in my develop branch. maybe the performence is much better.

later I will send you a pull request. thanks!

and the follow is the result:

go test -bench=.

#GithubAPI Routes: 203
   Beego: 179192 Bytes
   Denco: 113976 Bytes
   GocraftWeb: 97832 Bytes
   Goji: 50920 Bytes
   GoJsonRest: 142512 Bytes
   GorillaMux: 724552 Bytes
   HttpRouter: 44200 Bytes
   HttpTreeMux: 81632 Bytes
   Kocha: 790944 Bytes
   Martini: 547632 Bytes
   Pat: 16808 Bytes
   TigerTonic: 97880 Bytes
   Traffic: 496760 Bytes

#GPlusAPI Routes: 13
   Beego: 9584 Bytes
   Denco: 47744 Bytes
   GocraftWeb: 12088 Bytes
   Goji: 3456 Bytes
   GoJsonRest: 11608 Bytes
   GorillaMux: 34224 Bytes
   HttpRouter: 3128 Bytes
   HttpTreeMux: 7160 Bytes
   Kocha: 129424 Bytes
   Martini: 27408 Bytes
   Pat: 1448 Bytes
   TigerTonic: 9496 Bytes
   Traffic: 23456 Bytes

#ParseAPI Routes: 26
   Beego: 20264 Bytes
   Denco: 48296 Bytes
   GocraftWeb: 12288 Bytes
   Goji: 5872 Bytes
   GoJsonRest: 14816 Bytes
   GorillaMux: 60096 Bytes
   HttpRouter: 5768 Bytes
   HttpTreeMux: 7760 Bytes
   Kocha: 184480 Bytes
   Martini: 48584 Bytes
   Pat: 1976 Bytes
   TigerTonic: 10520 Bytes
   Traffic: 45672 Bytes

#Static Routes: 157
   HttpServeMux: 18272 Bytes
   Beego: 104696 Bytes
   Denco: 58504 Bytes
   GocraftWeb: 60024 Bytes
   Goji: 35008 Bytes
   GoJsonRest: 145816 Bytes
   GorillaMux: 327624 Bytes
   HttpRouter: 24632 Bytes
   HttpTreeMux: 78696 Bytes
   Kocha: 117920 Bytes
   Martini: 317312 Bytes
   Pat: 16712 Bytes
   TigerTonic: 87880 Bytes
   Traffic: 297736 Bytes

testing: warning: no tests to run
PASS
BenchmarkBeego_Param      500000          4086 ns/op        1181 B/op         17 allocs/op
BenchmarkDenco_Param     5000000           537 ns/op          50 B/op          2 allocs/op
BenchmarkGocraftWeb_Param    1000000          2136 ns/op         674 B/op          9 allocs/op
BenchmarkGoji_Param  1000000          1115 ns/op         343 B/op          2 allocs/op
BenchmarkGoJsonRest_Param     200000          7692 ns/op        1803 B/op         30 allocs/op
BenchmarkGorillaMux_Param     500000          5742 ns/op         786 B/op          7 allocs/op
BenchmarkHttpRouter_Param   10000000           203 ns/op          33 B/op          1 allocs/op
BenchmarkHttpTreeMux_Param   2000000           763 ns/op         343 B/op          2 allocs/op
BenchmarkKocha_Param     5000000           502 ns/op          58 B/op          3 allocs/op
BenchmarkMartini_Param    200000          7908 ns/op        1187 B/op         13 allocs/op
BenchmarkPat_Param   1000000          2284 ns/op         687 B/op         14 allocs/op
BenchmarkTigerTonic_Param     500000          3875 ns/op        1027 B/op         19 allocs/op
BenchmarkTraffic_Param    200000          7215 ns/op        2030 B/op         23 allocs/op

BenchmarkBeego_Param5     200000          8548 ns/op        1606 B/op         22 allocs/op
BenchmarkDenco_Param5    1000000          1624 ns/op         409 B/op          5 allocs/op
BenchmarkGocraftWeb_Param5    500000          3234 ns/op         948 B/op         12 allocs/op
BenchmarkGoji_Param5     1000000          1470 ns/op         343 B/op          2 allocs/op
BenchmarkGoJsonRest_Param5    200000         13307 ns/op        3289 B/op         41 allocs/op
BenchmarkGorillaMux_Param5    200000         10386 ns/op         916 B/op          7 allocs/op
BenchmarkHttpRouter_Param5   5000000           448 ns/op         163 B/op          1 allocs/op
BenchmarkHttpTreeMux_Param5  1000000          1192 ns/op         343 B/op          2 allocs/op
BenchmarkKocha_Param5    1000000          1922 ns/op         449 B/op         10 allocs/op
BenchmarkMartini_Param5   100000         16086 ns/op        1317 B/op         13 allocs/op
BenchmarkPat_Param5   500000          4992 ns/op        1494 B/op         25 allocs/op
BenchmarkTigerTonic_Param5    200000         13274 ns/op        2640 B/op         53 allocs/op
BenchmarkTraffic_Param5   200000         11942 ns/op        2357 B/op         31 allocs/op

BenchmarkBeego_Param20    200000         11251 ns/op        2649 B/op         24 allocs/op
BenchmarkDenco_Param20    500000          4262 ns/op        1679 B/op          7 allocs/op
BenchmarkGocraftWeb_Param20   200000         10206 ns/op        3864 B/op         17 allocs/op
BenchmarkGoji_Param20     500000          4280 ns/op        1261 B/op          2 allocs/op
BenchmarkGoJsonRest_Param20    50000         32105 ns/op       10666 B/op         77 allocs/op
BenchmarkGorillaMux_Param20   100000         19796 ns/op        3312 B/op         10 allocs/op
BenchmarkHttpRouter_Param20  1000000          1297 ns/op         653 B/op          1 allocs/op
BenchmarkHttpTreeMux_Param20      500000          6761 ns/op        2219 B/op          4 allocs/op
BenchmarkKocha_Param20    500000          5925 ns/op        1839 B/op         27 allocs/op
BenchmarkMartini_Param20       50000         70254 ns/op        3714 B/op         16 allocs/op
BenchmarkPat_Param20      500000          5002 ns/op        1494 B/op         25 allocs/op
BenchmarkTigerTonic_Param20    50000         52744 ns/op       11270 B/op        179 allocs/op
BenchmarkTraffic_Param20       50000         35244 ns/op        8251 B/op         68 allocs/op

BenchmarkBeego_ParamWrite     500000          5232 ns/op        1622 B/op         22 allocs/op
BenchmarkDenco_ParamWrite    5000000           545 ns/op          50 B/op          2 allocs/op
BenchmarkGocraftWeb_ParamWrite   1000000          2189 ns/op         683 B/op         10 allocs/op
BenchmarkGoji_ParamWrite     1000000          1171 ns/op         343 B/op          2 allocs/op
BenchmarkGoJsonRest_ParamWrite    200000          9266 ns/op        2284 B/op         35 allocs/op
BenchmarkGorillaMux_ParamWrite    500000          6357 ns/op         786 B/op          7 allocs/op
BenchmarkHttpRouter_ParamWrite  10000000           267 ns/op          33 B/op          1 allocs/op
BenchmarkHttpTreeMux_ParamWrite  2000000           851 ns/op         343 B/op          2 allocs/op
BenchmarkKocha_ParamWrite    5000000           636 ns/op          58 B/op          3 allocs/op
BenchmarkMartini_ParamWrite   200000          8298 ns/op        1287 B/op         16 allocs/op
BenchmarkPat_ParamWrite   500000          4045 ns/op        1129 B/op         19 allocs/op
BenchmarkTigerTonic_ParamWrite    500000          6124 ns/op        1485 B/op         25 allocs/op
BenchmarkTraffic_ParamWrite   200000          8771 ns/op        2464 B/op         27 allocs/op
BenchmarkBeego_GithubStatic   500000          3187 ns/op         821 B/op         14 allocs/op
BenchmarkDenco_GithubStatic 20000000            85.1 ns/op         0 B/op          0 allocs/op
BenchmarkGocraftWeb_GithubStatic     1000000          1418 ns/op         314 B/op          6 allocs/op
BenchmarkGoji_GithubStatic   5000000           553 ns/op           0 B/op          0 allocs/op
BenchmarkGoJsonRest_GithubStatic      500000          6594 ns/op        1162 B/op         26 allocs/op
BenchmarkGorillaMux_GithubStatic       50000         48178 ns/op         460 B/op          6 allocs/op
BenchmarkHttpRouter_GithubStatic    20000000            76.0 ns/op         0 B/op          0 allocs/op
BenchmarkHttpTreeMux_GithubStatic   20000000            75.8 ns/op         0 B/op          0 allocs/op
BenchmarkKocha_GithubStatic 20000000           123 ns/op           0 B/op          0 allocs/op
BenchmarkMartini_GithubStatic     100000         24472 ns/op         862 B/op         12 allocs/op
BenchmarkPat_GithubStatic     100000         16136 ns/op        3789 B/op         76 allocs/op
BenchmarkTigerTonic_GithubStatic     5000000           446 ns/op          49 B/op          1 allocs/op
BenchmarkTraffic_GithubStatic      20000         88844 ns/op       23368 B/op        172 allocs/op
BenchmarkBeego_GithubParam    500000          4735 ns/op        1245 B/op         18 allocs/op
BenchmarkDenco_GithubParam   2000000           994 ns/op         116 B/op          3 allocs/op
BenchmarkGocraftWeb_GithubParam   500000          2815 ns/op         737 B/op         10 allocs/op
BenchmarkGoji_GithubParam    1000000          1786 ns/op         343 B/op          2 allocs/op
BenchmarkGoJsonRest_GithubParam   200000         10054 ns/op        2192 B/op         33 allocs/op
BenchmarkGorillaMux_GithubParam    50000         31640 ns/op         819 B/op          7 allocs/op
BenchmarkHttpRouter_GithubParam  5000000           452 ns/op          98 B/op          1 allocs/op
BenchmarkHttpTreeMux_GithubParam     1000000          1304 ns/op         343 B/op          2 allocs/op
BenchmarkKocha_GithubParam   1000000          1129 ns/op         132 B/op          5 allocs/op
BenchmarkMartini_GithubParam       50000         33193 ns/op        1220 B/op         13 allocs/op
BenchmarkPat_GithubParam      200000         10578 ns/op        2628 B/op         56 allocs/op
BenchmarkTigerTonic_GithubParam   200000          6432 ns/op        1484 B/op         28 allocs/op
BenchmarkTraffic_GithubParam       50000         37349 ns/op        7152 B/op         60 allocs/op
BenchmarkBeego_GithubAll        2000       1065850 ns/op      240491 B/op       3584 allocs/op
BenchmarkDenco_GithubAll       10000        167449 ns/op       21353 B/op        508 allocs/op
BenchmarkGocraftWeb_GithubAll       5000        516241 ns/op      136593 B/op       1915 allocs/op
BenchmarkGoji_GithubAll     2000        893455 ns/op       57363 B/op        347 allocs/op
BenchmarkGoJsonRest_GithubAll       1000       1984326 ns/op      407513 B/op       6558 allocs/op
BenchmarkGorillaMux_GithubAll        100      19408668 ns/op      153479 B/op       1420 allocs/op
BenchmarkHttpRouter_GithubAll      20000         78090 ns/op       14101 B/op        169 allocs/op
BenchmarkHttpTreeMux_GithubAll     10000        182227 ns/op       57365 B/op        347 allocs/op
BenchmarkKocha_GithubAll       10000        208182 ns/op       24063 B/op        847 allocs/op
BenchmarkMartini_GithubAll       100      12874177 ns/op      245658 B/op       2942 allocs/op
BenchmarkPat_GithubAll       500       6100295 ns/op     1589303 B/op      32576 allocs/op
BenchmarkTigerTonic_GithubAll       2000       1302858 ns/op      251030 B/op       6087 allocs/op
BenchmarkTraffic_GithubAll       100      17070060 ns/op     3175411 B/op      24953 allocs/op
BenchmarkBeego_GPlusStatic    500000          3037 ns/op         804 B/op         14 allocs/op
BenchmarkDenco_GPlusStatic  50000000            48.1 ns/op         0 B/op          0 allocs/op
BenchmarkGocraftWeb_GPlusStatic  1000000          1419 ns/op         297 B/op          6 allocs/op
BenchmarkGoji_GPlusStatic    5000000           438 ns/op           0 B/op          0 allocs/op
BenchmarkGoJsonRest_GPlusStatic   500000          7296 ns/op        1146 B/op         26 allocs/op
BenchmarkGorillaMux_GPlusStatic   500000          4803 ns/op         460 B/op          6 allocs/op
BenchmarkHttpRouter_GPlusStatic 50000000            44.3 ns/op         0 B/op          0 allocs/op
BenchmarkHttpTreeMux_GPlusStatic    50000000            43.5 ns/op         0 B/op          0 allocs/op
BenchmarkKocha_GPlusStatic  20000000            88.3 ns/op         0 B/op          0 allocs/op
BenchmarkMartini_GPlusStatic      500000          6673 ns/op         862 B/op         12 allocs/op
BenchmarkPat_GPlusStatic     5000000           446 ns/op          99 B/op          2 allocs/op
BenchmarkTigerTonic_GPlusStatic 10000000           254 ns/op          33 B/op          1 allocs/op
BenchmarkTraffic_GPlusStatic      500000          5975 ns/op        1513 B/op         19 allocs/op
BenchmarkBeego_GPlusParam     500000          4392 ns/op        1180 B/op         17 allocs/op
BenchmarkDenco_GPlusParam    5000000           484 ns/op          50 B/op          2 allocs/op
BenchmarkGocraftWeb_GPlusParam   1000000          2288 ns/op         673 B/op          9 allocs/op
BenchmarkGoji_GPlusParam     1000000          1436 ns/op         343 B/op          2 allocs/op
BenchmarkGoJsonRest_GPlusParam    200000         11334 ns/op        1821 B/op         30 allocs/op
BenchmarkGorillaMux_GPlusParam    200000         11297 ns/op         786 B/op          7 allocs/op
BenchmarkHttpRouter_GPlusParam   5000000           299 ns/op          65 B/op          1 allocs/op
BenchmarkHttpTreeMux_GPlusParam  2000000           874 ns/op         343 B/op          2 allocs/op
BenchmarkKocha_GPlusParam    5000000           655 ns/op          58 B/op          3 allocs/op
BenchmarkMartini_GPlusParam   200000         10901 ns/op        1187 B/op         13 allocs/op
BenchmarkPat_GPlusParam  1000000          2858 ns/op         753 B/op         14 allocs/op
BenchmarkTigerTonic_GPlusParam    500000          4615 ns/op        1103 B/op         19 allocs/op
BenchmarkTraffic_GPlusParam   200000         10742 ns/op        2043 B/op         23 allocs/op
BenchmarkBeego_GPlus2Params   200000          5683 ns/op        1244 B/op         18 allocs/op
BenchmarkDenco_GPlus2Params  2000000           987 ns/op         116 B/op          3 allocs/op
BenchmarkGocraftWeb_GPlus2Params     1000000          2731 ns/op         736 B/op         10 allocs/op
BenchmarkGoji_GPlus2Params   1000000          2037 ns/op         343 B/op          2 allocs/op
BenchmarkGoJsonRest_GPlus2Params      200000         10705 ns/op        2195 B/op         33 allocs/op
BenchmarkGorillaMux_GPlus2Params      100000         28040 ns/op         819 B/op          7 allocs/op
BenchmarkHttpRouter_GPlus2Params     5000000           337 ns/op          65 B/op          1 allocs/op
BenchmarkHttpTreeMux_GPlus2Params    2000000          1136 ns/op         343 B/op          2 allocs/op
BenchmarkKocha_GPlus2Params  1000000          1144 ns/op         132 B/op          5 allocs/op
BenchmarkMartini_GPlus2Params      50000         34688 ns/op        1320 B/op         17 allocs/op
BenchmarkPat_GPlus2Params     200000          8651 ns/op        2403 B/op         41 allocs/op
BenchmarkTigerTonic_GPlus2Params      500000          7717 ns/op        1586 B/op         28 allocs/op
BenchmarkTraffic_GPlus2Params      50000         29947 ns/op        3627 B/op         35 allocs/op
BenchmarkBeego_GPlusAll    50000         62392 ns/op       14947 B/op        223 allocs/op
BenchmarkDenco_GPlusAll   200000          9128 ns/op         887 B/op         27 allocs/op
BenchmarkGocraftWeb_GPlusAll       50000         31896 ns/op        8352 B/op        117 allocs/op
BenchmarkGoji_GPlusAll    100000         18817 ns/op        3775 B/op         22 allocs/op
BenchmarkGoJsonRest_GPlusAll       10000        122218 ns/op       24098 B/op        402 allocs/op
BenchmarkGorillaMux_GPlusAll       10000        174504 ns/op        9730 B/op         91 allocs/op
BenchmarkHttpRouter_GPlusAll      500000          3877 ns/op         660 B/op         11 allocs/op
BenchmarkHttpTreeMux_GPlusAll     200000         10027 ns/op        3775 B/op         22 allocs/op
BenchmarkKocha_GPlusAll   200000          9599 ns/op        1014 B/op         43 allocs/op
BenchmarkMartini_GPlusAll      10000        196508 ns/op       15549 B/op        194 allocs/op
BenchmarkPat_GPlusAll      50000         70916 ns/op       17706 B/op        346 allocs/op
BenchmarkTigerTonic_GPlusAll       50000         73256 ns/op       15489 B/op        322 allocs/op
BenchmarkTraffic_GPlusAll      10000        233066 ns/op       42154 B/op        447 allocs/op
BenchmarkBeego_ParseStatic    500000          3606 ns/op         821 B/op         14 allocs/op
BenchmarkDenco_ParseStatic  50000000            60.8 ns/op         0 B/op          0 allocs/op
BenchmarkGocraftWeb_ParseStatic  1000000          1401 ns/op         314 B/op          6 allocs/op
BenchmarkGoji_ParseStatic    5000000           608 ns/op           0 B/op          0 allocs/op
BenchmarkGoJsonRest_ParseStatic   500000          7214 ns/op        1146 B/op         26 allocs/op
BenchmarkGorillaMux_ParseStatic   200000          9809 ns/op         460 B/op          6 allocs/op
BenchmarkHttpRouter_ParseStatic 50000000            51.4 ns/op         0 B/op          0 allocs/op
BenchmarkHttpTreeMux_ParseStatic    20000000            79.0 ns/op         0 B/op          0 allocs/op
BenchmarkKocha_ParseStatic  20000000           107 ns/op           0 B/op          0 allocs/op
BenchmarkMartini_ParseStatic      500000          7797 ns/op         862 B/op         12 allocs/op
BenchmarkPat_ParseStatic     1000000          1250 ns/op         249 B/op          5 allocs/op
BenchmarkTigerTonic_ParseStatic  5000000           412 ns/op          49 B/op          1 allocs/op
BenchmarkTraffic_ParseStatic      200000         11557 ns/op        2395 B/op         25 allocs/op
BenchmarkBeego_ParseParam     500000          4492 ns/op        1196 B/op         17 allocs/op
BenchmarkDenco_ParseParam    5000000           526 ns/op          50 B/op          2 allocs/op
BenchmarkGocraftWeb_ParseParam   1000000          2268 ns/op         689 B/op          9 allocs/op
BenchmarkGoji_ParseParam     1000000          1509 ns/op         343 B/op          2 allocs/op
BenchmarkGoJsonRest_ParseParam    200000          9156 ns/op        1807 B/op         30 allocs/op
BenchmarkGorillaMux_ParseParam    200000          9726 ns/op         786 B/op          7 allocs/op
BenchmarkHttpRouter_ParseParam  10000000           263 ns/op          65 B/op          1 allocs/op
BenchmarkHttpTreeMux_ParseParam  2000000           936 ns/op         343 B/op          2 allocs/op
BenchmarkKocha_ParseParam    5000000           629 ns/op          58 B/op          3 allocs/op
BenchmarkMartini_ParseParam   200000         10959 ns/op        1187 B/op         13 allocs/op
BenchmarkPat_ParseParam   500000          4245 ns/op        1197 B/op         20 allocs/op
BenchmarkTigerTonic_ParseParam    500000          4236 ns/op        1084 B/op         19 allocs/op
BenchmarkTraffic_ParseParam   200000          9281 ns/op        2329 B/op         25 allocs/op
BenchmarkBeego_Parse2Params   500000          4585 ns/op        1244 B/op         18 allocs/op
BenchmarkDenco_Parse2Params  2000000           755 ns/op         116 B/op          3 allocs/op
BenchmarkGocraftWeb_Parse2Params     1000000          2579 ns/op         736 B/op         10 allocs/op
BenchmarkGoji_Parse2Params   1000000          1433 ns/op         343 B/op          2 allocs/op
BenchmarkGoJsonRest_Parse2Params      200000          9785 ns/op        2166 B/op         33 allocs/op
BenchmarkGorillaMux_Parse2Params      200000         10083 ns/op         819 B/op          7 allocs/op
BenchmarkHttpRouter_Parse2Params     5000000           292 ns/op          65 B/op          1 allocs/op
BenchmarkHttpTreeMux_Parse2Params    2000000           947 ns/op         343 B/op          2 allocs/op
BenchmarkKocha_Parse2Params  2000000           943 ns/op         132 B/op          5 allocs/op
BenchmarkMartini_Parse2Params     200000         10054 ns/op        1220 B/op         13 allocs/op
BenchmarkPat_Parse2Params     500000          3669 ns/op         908 B/op         21 allocs/op
BenchmarkTigerTonic_Parse2Params      500000          6553 ns/op        1488 B/op         28 allocs/op
BenchmarkTraffic_Parse2Params     200000          9363 ns/op        2134 B/op         25 allocs/op
BenchmarkBeego_ParseAll    10000        103330 ns/op       27503 B/op        420 allocs/op
BenchmarkDenco_ParseAll   200000         11258 ns/op        1008 B/op         35 allocs/op
BenchmarkGocraftWeb_ParseAll       50000         51958 ns/op       14318 B/op        210 allocs/op
BenchmarkGoji_ParseAll    100000         29556 ns/op        5491 B/op         33 allocs/op
BenchmarkGoJsonRest_ParseAll       10000        211105 ns/op       41617 B/op        759 allocs/op
BenchmarkGorillaMux_ParseAll        5000        380477 ns/op       17274 B/op        175 allocs/op
BenchmarkHttpRouter_ParseAll      500000          5238 ns/op         665 B/op         16 allocs/op
BenchmarkHttpTreeMux_ParseAll     200000         15440 ns/op        5491 B/op         33 allocs/op
BenchmarkKocha_ParseAll   200000         15235 ns/op        1160 B/op         54 allocs/op
BenchmarkMartini_ParseAll      10000        252829 ns/op       27712 B/op        333 allocs/op
BenchmarkPat_ParseAll      20000         78359 ns/op       18294 B/op        385 allocs/op
BenchmarkTigerTonic_ParseAll       20000         99349 ns/op       20868 B/op        420 allocs/op
BenchmarkTraffic_ParseAll      10000        331941 ns/op       70677 B/op        763 allocs/op
BenchmarkHttpServeMux_StaticAll     1000       1634267 ns/op         104 B/op          8 allocs/op
BenchmarkBeego_StaticAll        5000        539431 ns/op      128898 B/op       2226 allocs/op
BenchmarkDenco_StaticAll      100000         19368 ns/op           0 B/op          0 allocs/op
BenchmarkGocraftWeb_StaticAll      10000        263807 ns/op       49239 B/op        951 allocs/op
BenchmarkGoji_StaticAll    10000        128495 ns/op           0 B/op          0 allocs/op
BenchmarkGoJsonRest_StaticAll       2000       1202367 ns/op      183070 B/op       4129 allocs/op
BenchmarkGorillaMux_StaticAll        500       6412376 ns/op       72384 B/op        966 allocs/op
BenchmarkHttpRouter_StaticAll     100000         25137 ns/op           0 B/op          0 allocs/op
BenchmarkHttpTreeMux_StaticAll    100000         25813 ns/op           0 B/op          0 allocs/op
BenchmarkKocha_StaticAll       50000         36208 ns/op           0 B/op          0 allocs/op
BenchmarkMartini_StaticAll       500       6262839 ns/op      145782 B/op       2521 allocs/op
BenchmarkPat_StaticAll      1000       2381715 ns/op      554324 B/op      11250 allocs/op
BenchmarkTigerTonic_StaticAll      20000         85906 ns/op        7780 B/op        158 allocs/op
BenchmarkTraffic_StaticAll       100      14011627 ns/op     3797675 B/op      27948 allocs/op
ok      github.com/julienschmidt/go-http-routing-benchmark  500.277s

Benchmarks out-of-date

It's great that these benchmarks exist, but there should be a date associated with the running of the benchmark. It would be even better if there was also some process that ran once in a while to update these. It looks like the last run was more than a year old for some of the routers.

Thanks for the great work with httprouter!

new benchmark for these routing

Hi,

I find the benchmark for these routing codes is very old, the README.md file is commited four years ago

Is there new benchmark for these framework? I believe these framework have done a lot of work to improve their performance

SIGQUIT when running with -bench=.

Here's a problem I've now run into consistently running the benchmarks using go 1.4.2 and 1.5 (master):

http://pastebin.com/K1QweDns

The SIGQUIT occurs in different places each time, although the stack dumps often mention Beego.

Significantly, these problems were only seen using virtualized Linux instances (VMWare, VirtualBox). Have you seen similar stack dumps running the full suite?

Rivet framework changed, causes tests to fail

When I did go get today the build failed because the Rivet api changed. Commented it out and ran in to issues from previous issue with a panic that a nil pointer was dereferenced.

cant run bench

I followed the instructions to run this test myself and got the following. I'm running on ubuntu 18.04 and go 1.13.5

go get github.com/julienschmidt/go-http-routing-benchmark
# github.com/julienschmidt/go-http-routing-benchmark
src/github.com/julienschmidt/go-http-routing-benchmark/routers.go:1242:23: undefined: possum.Context
src/github.com/julienschmidt/go-http-routing-benchmark/routers.go:1246:28: undefined: possum.Context
src/github.com/julienschmidt/go-http-routing-benchmark/routers.go:1251:27: undefined: possum.Context
src/github.com/julienschmidt/go-http-routing-benchmark/routers.go:1262:12: undefined: possum.NewServerMux
src/github.com/julienschmidt/go-http-routing-benchmark/routers.go:1270:12: undefined: possum.NewServerMux
ย cd src/github.com/julienschmidt/go-http-routing-benchmark/
go get -u
go: downloading github.com/astaxie/beego v1.12.0
go: downloading github.com/go-chi/chi v4.0.2+incompatible
go: downloading github.com/naoina/denco v0.0.0-20180930074809-8475105a6b4c
go: downloading github.com/zenazn/goji v0.9.0
go: downloading github.com/mailgun/route v0.0.0-20181101151700-58b44163b968
go: downloading github.com/gin-gonic/gin v1.5.0
go: downloading github.com/labstack/echo/v4 v4.1.11
go: downloading github.com/naoina/kocha-urlrouter v0.0.0-20140609163054-ad3a6f079210
go: downloading gopkg.in/macaron.v1 v1.3.4
go: downloading github.com/plimble/ace v0.0.0-20180623113504-ba79f505f416
go: extracting github.com/go-chi/chi v4.0.2+incompatible
go: downloading github.com/lunny/tango v0.5.6
go: extracting github.com/zenazn/goji v0.9.0
go: downloading github.com/rcrowley/go-tigertonic v0.0.0-20170420123839-fe6b9f080eb7
go: extracting github.com/labstack/echo/v4 v4.1.11
go: downloading golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad
go: extracting github.com/plimble/ace v0.0.0-20180623113504-ba79f505f416
go: extracting github.com/naoina/kocha-urlrouter v0.0.0-20140609163054-ad3a6f079210
go: downloading github.com/lunny/log v0.0.0-20160921050905-7887c61bf0de
go: downloading github.com/mikespook/possum v0.0.0-20170224044927-56d7ebb6470b
go: extracting gopkg.in/macaron.v1 v1.3.4
go: extracting github.com/gin-gonic/gin v1.5.0
go: downloading github.com/labstack/gommon v0.3.0
go: extracting github.com/naoina/denco v0.0.0-20180930074809-8475105a6b4c
go: downloading github.com/dimfeld/httptreemux v5.0.1+incompatible
go: extracting github.com/mailgun/route v0.0.0-20181101151700-58b44163b968
go: downloading github.com/go-zoo/bone v1.3.0
go: extracting github.com/astaxie/beego v1.12.0
go: extracting github.com/lunny/tango v0.5.6
go: extracting github.com/rcrowley/go-tigertonic v0.0.0-20170420123839-fe6b9f080eb7
go: extracting github.com/lunny/log v0.0.0-20160921050905-7887c61bf0de
go: downloading github.com/ant0ine/go-json-rest v3.3.2+incompatible
go: downloading github.com/ursiform/bear v1.0.1
go: downloading goji.io v2.0.2+incompatible
go: extracting github.com/labstack/gommon v0.3.0
go: downloading github.com/vulcand/predicate v1.1.0
go: extracting github.com/dimfeld/httptreemux v5.0.1+incompatible
go: extracting golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad
go: extracting github.com/ursiform/bear v1.0.1
go: extracting github.com/mikespook/possum v0.0.0-20170224044927-56d7ebb6470b
go: extracting github.com/ant0ine/go-json-rest v3.3.2+incompatible
go: extracting goji.io v2.0.2+incompatible
go: extracting github.com/go-zoo/bone v1.3.0
go: downloading github.com/plimble/utils v0.0.0-20150615054616-fe08d46675cd
go: downloading github.com/cloudykit/router v0.0.0-20170501012743-15c4ed71df81
go: downloading github.com/vanng822/r2router v0.0.0-20150523112421-1023140a4f30
go: downloading gopkg.in/ini.v1 v1.48.0
go: downloading github.com/valyala/fasttemplate v1.0.1
go: downloading github.com/go-macaron/inject v0.0.0-20160627170012-d8a0b8677191
go: downloading gitea.com/lunny/log v0.0.0-20190322053110-01b5df579c4e
go: downloading github.com/julienschmidt/httprouter v1.3.0
go: downloading github.com/plimble/sessions v0.0.0-20180326075456-7047d39da9ad
go: extracting github.com/valyala/fasttemplate v1.0.1
go: downloading github.com/gowww/router v0.0.0-20180327195201-5f9c626ef619
go: extracting gopkg.in/ini.v1 v1.48.0
go: extracting github.com/vanng822/r2router v0.0.0-20150523112421-1023140a4f30
go: extracting github.com/plimble/utils v0.0.0-20150615054616-fe08d46675cd
go: extracting github.com/cloudykit/router v0.0.0-20170501012743-15c4ed71df81
go: extracting github.com/go-macaron/inject v0.0.0-20160627170012-d8a0b8677191
go: downloading github.com/mattn/go-colorable v0.1.2
go: downloading github.com/mattn/go-isatty v0.0.9
go: downloading github.com/aerogo/aero v1.3.42
go: downloading golang.org/x/net v0.0.0-20190926025831-c00fd9afed17
go: extracting github.com/julienschmidt/httprouter v1.3.0
go: extracting gitea.com/lunny/log v0.0.0-20190322053110-01b5df579c4e
go: extracting github.com/vulcand/predicate v1.1.0
go: extracting github.com/plimble/sessions v0.0.0-20180326075456-7047d39da9ad
go: downloading github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40
go: downloading github.com/gravitational/trace v0.0.0-20190726142706-a535a178675f
go: downloading github.com/gin-contrib/sse v0.1.0
go: downloading github.com/emicklei/go-restful v2.10.0+incompatible
go: downloading github.com/tinylib/msgp v1.1.0
go: extracting github.com/gowww/router v0.0.0-20180327195201-5f9c626ef619
go: downloading github.com/pilu/traffic v0.5.3
go: extracting github.com/mattn/go-colorable v0.1.2
go: extracting github.com/mattn/go-isatty v0.0.9
go: downloading github.com/typepress/rivet v1.1.1-0.20151208095308-d62b4fcaf6b9
go: downloading github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b
go: extracting github.com/aerogo/aero v1.3.42
go: downloading github.com/aerogo/http v1.1.1
go: extracting github.com/pilu/traffic v0.5.3
go: extracting github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b
go: extracting github.com/emicklei/go-restful v2.10.0+incompatible
go: extracting github.com/gravitational/trace v0.0.0-20190726142706-a535a178675f
go: extracting github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40
go: extracting github.com/gin-contrib/sse v0.1.0
go: extracting github.com/typepress/rivet v1.1.1-0.20151208095308-d62b4fcaf6b9
go: extracting github.com/tinylib/msgp v1.1.0
go: downloading github.com/valyala/bytebufferpool v1.0.0
go: downloading github.com/golang/protobuf v1.3.2
go: downloading github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c
go: downloading github.com/json-iterator/go v1.1.7
go: downloading gopkg.in/go-playground/validator.v9 v9.29.1
go: downloading github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563
go: downloading github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab
go: extracting golang.org/x/net v0.0.0-20190926025831-c00fd9afed17
go: extracting github.com/aerogo/http v1.1.1
go: downloading github.com/gocraft/web v0.0.0-20190207150652-9707327fb69b
go: downloading golang.org/x/sys v0.0.0-20191025090151-53bf42e6b339
go: downloading github.com/ugorji/go v1.1.7
go: extracting github.com/valyala/bytebufferpool v1.0.0
go: downloading github.com/sirupsen/logrus v1.4.2
go: extracting github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563
go: extracting gopkg.in/go-playground/validator.v9 v9.29.1
go: extracting github.com/gocraft/web v0.0.0-20190207150652-9707327fb69b
go: extracting github.com/json-iterator/go v1.1.7
go: extracting github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c
go: downloading github.com/aerogo/linter-performance v1.0.6
go: extracting github.com/golang/protobuf v1.3.2
go: extracting github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab
go: extracting github.com/ugorji/go v1.1.7
go: downloading github.com/ugorji/go/codec v1.1.7
go: downloading github.com/aerogo/session v0.1.8
go: downloading github.com/aerogo/session-store-memory v0.1.9
go: downloading github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742
go: downloading github.com/akyoto/hash v0.4.8
go: extracting github.com/sirupsen/logrus v1.4.2
go: downloading github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421
go: downloading github.com/jonboulle/clockwork v0.1.0
go: extracting github.com/aerogo/session v0.1.8
go: extracting github.com/aerogo/linter-performance v1.0.6
go: downloading github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0
go: downloading github.com/konsorten/go-windows-terminal-sequences v1.0.2
go: extracting github.com/ugorji/go/codec v1.1.7
go: extracting github.com/jonboulle/clockwork v0.1.0
go: extracting github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421
go: extracting github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742
go: extracting github.com/akyoto/hash v0.4.8
go: extracting github.com/aerogo/session-store-memory v0.1.9
go: downloading github.com/leodido/go-urn v1.1.0
go: downloading github.com/akyoto/stringutils v0.3.0
go: downloading github.com/akyoto/color v1.8.11
go: downloading github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644
go: downloading gopkg.in/fsnotify.v1 v1.4.7
go: extracting golang.org/x/sys v0.0.0-20191025090151-53bf42e6b339
go: downloading github.com/akyoto/uuid v1.1.3
go: downloading github.com/aerogo/csp v0.1.10
go: downloading github.com/philhofer/fwd v1.0.0
go: extracting github.com/konsorten/go-windows-terminal-sequences v1.0.2
go: extracting github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0
go: downloading github.com/pilu/config v0.0.0-20131214182432-3eb99e6c0b9a
go: extracting github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644
go: extracting github.com/akyoto/stringutils v0.3.0
go: extracting github.com/leodido/go-urn v1.1.0
go: downloading github.com/go-playground/universal-translator v0.16.0
go: downloading github.com/unknwon/com v1.0.1
go: downloading github.com/go-playground/lars v4.0.1+incompatible
go: extracting github.com/akyoto/uuid v1.1.3
go: extracting gopkg.in/fsnotify.v1 v1.4.7
go: extracting github.com/akyoto/color v1.8.11
go: downloading github.com/akyoto/colorable v0.1.7
go: downloading github.com/akyoto/tty v0.1.3
go: downloading golang.org/x/text v0.3.2
go: extracting github.com/philhofer/fwd v1.0.0
go: downloading github.com/zeebo/xxh3 v0.0.0-20191021174148-b56a7dc3d80c
go: extracting github.com/pilu/config v0.0.0-20131214182432-3eb99e6c0b9a
go: extracting github.com/aerogo/csp v0.1.10
go: extracting github.com/go-playground/universal-translator v0.16.0
go: downloading github.com/go-playground/locales v0.12.1
go: extracting github.com/akyoto/colorable v0.1.7
go: extracting github.com/unknwon/com v1.0.1
go: extracting github.com/zeebo/xxh3 v0.0.0-20191021174148-b56a7dc3d80c
go: extracting github.com/go-playground/locales v0.12.1
go: extracting github.com/akyoto/tty v0.1.3
go: extracting github.com/go-playground/lars v4.0.1+incompatible
go: downloading github.com/go-playground/form v3.1.4+incompatible
go: downloading github.com/gorilla/websocket v1.4.1
go: extracting github.com/gorilla/websocket v1.4.1
go: extracting github.com/go-playground/form v3.1.4+incompatible
go: extracting golang.org/x/text v0.3.2
go: finding github.com/leodido/go-urn v1.2.0
go: finding github.com/gravitational/trace latest
go: finding github.com/go-macaron/inject latest
go: finding github.com/go-martini/martini latest
go: finding github.com/pilu/config latest
go: finding github.com/shiena/ansicolor latest
go: finding github.com/zeebo/xxh3 latest
go: finding github.com/go-chi/chi v4.0.2+incompatible
go: finding gopkg.in/go-playground/validator.v9 v9.31.0
go: finding github.com/satori/go.uuid v1.2.0
go: finding github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b
go: finding github.com/go-playground/form v3.1.4+incompatible
go: finding github.com/codegangsta/inject latest
go: finding github.com/gocraft/web latest
go: finding github.com/labstack/echo/v4 v4.1.13
go: finding github.com/valyala/fasttemplate v1.1.0
go: finding golang.org/x/net latest
go: finding github.com/lunny/tango v0.5.6
go: finding github.com/tinylib/msgp v1.1.1
go: finding golang.org/x/text v0.3.2
go: finding github.com/emicklei/go-restful v2.11.1+incompatible
go: finding github.com/go-zoo/bone v1.3.0
go: finding github.com/labstack/gommon v0.3.0
go: finding github.com/gorilla/websocket v1.4.1
go: finding gopkg.in/macaron.v1 v1.3.4
go: finding github.com/lunny/log latest
go: finding github.com/ugorji/go/codec v1.1.7
go: finding github.com/philhofer/fwd v1.0.0
go: finding golang.org/x/sys latest
go: finding github.com/vulcand/predicate v1.1.0
go: finding github.com/unknwon/com v1.0.1
go: finding github.com/aerogo/aero v1.3.52
go: finding github.com/golang/protobuf v1.3.2
go: finding github.com/gin-contrib/sse v0.1.0
go: finding golang.org/x/crypto latest
go: finding github.com/konsorten/go-windows-terminal-sequences v1.0.2
go: finding github.com/ursiform/bear v1.0.1
go: finding github.com/pilu/traffic v0.5.3
go: finding github.com/aerogo/session v0.1.9
go: finding github.com/typepress/rivet v1.1.0
go: finding gopkg.in/ini.v1 v1.51.1
go: finding github.com/typepress/rivet v1.1.1-0.20151208095308-d62b4fcaf6b9
go: finding github.com/julienschmidt/httprouter v1.3.0
go: finding github.com/oxtoacart/bpool latest
go: finding github.com/mikespook/possum latest
go: finding github.com/gowww/router latest
go: finding github.com/valyala/bytebufferpool v1.0.0
go: finding github.com/ant0ine/go-json-rest v3.3.2+incompatible
go: finding github.com/akyoto/tty v0.1.3
go: finding github.com/go-playground/lars v4.0.1+incompatible
go: finding github.com/bmizerany/pat latest
go: finding github.com/plimble/ace latest
go: finding github.com/naoina/denco latest
go: finding github.com/aerogo/session-store-memory v0.1.9
go: finding github.com/akyoto/stringutils v0.3.1
go: finding goji.io v2.0.2+incompatible
go: finding github.com/akyoto/hash v0.4.9
go: finding github.com/akyoto/uuid v1.1.3
go: finding github.com/astaxie/beego v1.12.0
go: finding github.com/vanng822/r2router latest
go: finding github.com/sirupsen/logrus v1.4.2
go: finding github.com/dimfeld/httptreemux v5.0.1+incompatible
go: finding github.com/modern-go/reflect2 v1.0.1
go: finding github.com/mattn/go-colorable v0.1.4
go: finding github.com/zenazn/goji v0.9.0
go: finding github.com/rcrowley/go-metrics latest
go: finding github.com/plimble/sessions latest
go: finding gitea.com/lunny/log latest
go: finding github.com/aerogo/csp v0.1.10
go: finding github.com/aerogo/http v1.1.3
go: finding github.com/akyoto/color v1.8.11
go: finding github.com/gin-gonic/gin v1.5.0
go: finding github.com/plimble/utils latest
go: finding github.com/naoina/kocha-urlrouter latest
go: finding github.com/mattn/go-isatty v0.0.11
go: finding github.com/akyoto/colorable v0.1.7
go: finding github.com/mailgun/route latest
go: finding github.com/aerogo/linter-performance v1.0.7
go: finding github.com/go-playground/universal-translator v0.17.0
go: finding github.com/json-iterator/go v1.1.9
go: finding github.com/go-playground/locales v0.13.0
go: finding github.com/modern-go/concurrent latest
go: finding github.com/rcrowley/go-tigertonic latest
go: finding github.com/cloudykit/router latest
go: finding github.com/jonboulle/clockwork v0.1.0
go: downloading github.com/aerogo/aero v1.3.52
go: downloading github.com/mikespook/possum v0.0.0-20191211205952-9816518f75d5
go: downloading github.com/labstack/echo v3.3.10+incompatible
go: downloading golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876
go: downloading github.com/mattn/go-isatty v0.0.11
go: downloading github.com/emicklei/go-restful v2.11.1+incompatible
go: downloading github.com/json-iterator/go v1.1.9
go: downloading github.com/mailgun/route v0.0.0-20191025171320-daa4df6c711a
go: extracting github.com/mattn/go-isatty v0.0.11
go: downloading golang.org/x/sys v0.0.0-20200102141924-c96a22e43c9c
go: extracting github.com/aerogo/aero v1.3.52
go: downloading github.com/aerogo/linter-performance v1.0.7
go: extracting github.com/json-iterator/go v1.1.9
go: downloading github.com/aerogo/http v1.1.3
go: extracting github.com/emicklei/go-restful v2.11.1+incompatible
go: extracting github.com/mailgun/route v0.0.0-20191025171320-daa4df6c711a
go: extracting github.com/mikespook/possum v0.0.0-20191211205952-9816518f75d5
go: downloading github.com/aerogo/session v0.1.9
go: downloading gopkg.in/go-playground/validator.v9 v9.31.0
go: extracting github.com/aerogo/linter-performance v1.0.7
go: extracting github.com/labstack/echo v3.3.10+incompatible
go: extracting golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876
go: downloading github.com/gravitational/trace v0.0.0-20191125212024-42a8fffe760d
go: downloading github.com/labstack/echo/v4 v4.1.13
go: downloading github.com/akyoto/stringutils v0.3.1
go: downloading github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd
go: downloading github.com/modern-go/reflect2 v1.0.1
go: extracting github.com/akyoto/stringutils v0.3.1
go: extracting github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd
go: downloading gopkg.in/ini.v1 v1.51.1
go: downloading github.com/tinylib/msgp v1.1.1
go: extracting github.com/modern-go/reflect2 v1.0.1
go: extracting golang.org/x/sys v0.0.0-20200102141924-c96a22e43c9c
go: extracting github.com/labstack/echo/v4 v4.1.13
go: extracting github.com/gravitational/trace v0.0.0-20191125212024-42a8fffe760d
go: extracting github.com/aerogo/session v0.1.9
go: extracting gopkg.in/go-playground/validator.v9 v9.31.0
go: extracting github.com/aerogo/http v1.1.3
go: downloading github.com/akyoto/hash v0.4.9
go: downloading github.com/go-playground/universal-translator v0.17.0
go: downloading github.com/leodido/go-urn v1.2.0
go: downloading github.com/valyala/fasttemplate v1.1.0
go: downloading github.com/mattn/go-colorable v0.1.4
go: extracting gopkg.in/ini.v1 v1.51.1
go: extracting github.com/tinylib/msgp v1.1.1
go: extracting github.com/mattn/go-colorable v0.1.4
go: extracting github.com/valyala/fasttemplate v1.1.0
go: extracting github.com/go-playground/universal-translator v0.17.0
go: extracting github.com/akyoto/hash v0.4.9
go: downloading github.com/zeebo/xxh3 v0.0.0-20191227220208-65f423c10688
go: downloading github.com/go-playground/locales v0.13.0
go: extracting github.com/leodido/go-urn v1.2.0
go: extracting github.com/zeebo/xxh3 v0.0.0-20191227220208-65f423c10688
go: extracting github.com/go-playground/locales v0.13.0
# github.com/julienschmidt/go-http-routing-benchmark
./routers.go:1242:23: undefined: possum.Context
./routers.go:1246:28: undefined: possum.Context
./routers.go:1251:27: undefined: possum.Context
./routers.go:1262:12: undefined: possum.NewServerMux
./routers.go:1270:12: undefined: possum.NewServerMux
ย go test -bench=.
# github.com/julienschmidt/go-http-routing-benchmark [github.com/julienschmidt/go-http-routing-benchmark.test]
./routers.go:1242:23: undefined: possum.Context
./routers.go:1246:28: undefined: possum.Context
./routers.go:1251:27: undefined: possum.Context
./routers.go:1262:12: undefined: possum.NewServerMux
./routers.go:1270:12: undefined: possum.NewServerMux
FAIL	github.com/julienschmidt/go-http-routing-benchmark [build failed]

Benchmark against native Go http.HandleFunc

Hi. Please include the native Go http.HandleFunc in your benchmarks. I know it lacks a lot of features but it would be cool to see how httprouter compares against it. Thank you

Broken go get

After run a go get -u -v I got:

โžœ go get -u -v
github.com/julienschmidt/go-http-routing-benchmark (download)
github.com/ant0ine/go-json-rest (download)
github.com/astaxie/beego (download)
github.com/bmizerany/pat (download)
github.com/dimfeld/httptreemux (download)
github.com/emicklei/go-restful (download)
github.com/gin-gonic/gin (download)
github.com/gin-contrib/sse (download)
github.com/golang/protobuf (download)
github.com/ugorji/go (download)
Fetching https://gopkg.in/go-playground/validator.v8?go-get=1
Parsing meta tags from https://gopkg.in/go-playground/validator.v8?go-get=1 (status code 200)
get "gopkg.in/go-playground/validator.v8": found meta tag get.metaImport{Prefix:"gopkg.in/go-playground/validator.v8", VCS:"git", RepoRoot:"https://gopkg.in/go-playground/validator.v8"} at https://gopkg.in/go-playground/validator.v8?go-get=1
gopkg.in/go-playground/validator.v8 (download)
Fetching https://gopkg.in/yaml.v2?go-get=1
Parsing meta tags from https://gopkg.in/yaml.v2?go-get=1 (status code 200)
get "gopkg.in/yaml.v2": found meta tag get.metaImport{Prefix:"gopkg.in/yaml.v2", VCS:"git", RepoRoot:"https://gopkg.in/yaml.v2"} at https://gopkg.in/yaml.v2?go-get=1
gopkg.in/yaml.v2 (download)
github.com/mattn/go-isatty (download)
github.com/go-macaron/macaron (download)
github.com/Unknwon/com (download)
github.com/go-macaron/inject (download)
Fetching https://golang.org/x/crypto/pbkdf2?go-get=1
Parsing meta tags from https://golang.org/x/crypto/pbkdf2?go-get=1 (status code 200)
get "golang.org/x/crypto/pbkdf2": found meta tag get.metaImport{Prefix:"golang.org/x/crypto", VCS:"git", RepoRoot:"https://go.googlesource.com/crypto"} at https://golang.org/x/crypto/pbkdf2?go-get=1
get "golang.org/x/crypto/pbkdf2": verifying non-authoritative meta tag
Fetching https://golang.org/x/crypto?go-get=1
Parsing meta tags from https://golang.org/x/crypto?go-get=1 (status code 200)
golang.org/x/crypto (download)
Fetching https://gopkg.in/ini.v1?go-get=1
Parsing meta tags from https://gopkg.in/ini.v1?go-get=1 (status code 200)
get "gopkg.in/ini.v1": found meta tag get.metaImport{Prefix:"gopkg.in/ini.v1", VCS:"git", RepoRoot:"https://gopkg.in/ini.v1"} at https://gopkg.in/ini.v1?go-get=1
gopkg.in/ini.v1 (download)
github.com/go-martini/martini (download)
github.com/codegangsta/inject (download)
github.com/go-playground/lars (download)
github.com/go-playground/form (download)
github.com/gorilla/websocket (download)
github.com/go-zoo/bone (download)
github.com/gocraft/web (download)
github.com/gorilla/mux (download)
github.com/julienschmidt/httprouter (download)
github.com/labstack/echo (download)
github.com/labstack/gommon (download)
github.com/mattn/go-colorable (download)
github.com/valyala/fasttemplate (download)
Fetching https://golang.org/x/crypto/acme/autocert?go-get=1
Parsing meta tags from https://golang.org/x/crypto/acme/autocert?go-get=1 (status code 200)
get "golang.org/x/crypto/acme/autocert": found meta tag get.metaImport{Prefix:"golang.org/x/crypto", VCS:"git", RepoRoot:"https://go.googlesource.com/crypto"} at https://golang.org/x/crypto/acme/autocert?go-get=1
get "golang.org/x/crypto/acme/autocert": verifying non-authoritative meta tag
Fetching https://golang.org/x/crypto/acme?go-get=1
Parsing meta tags from https://golang.org/x/crypto/acme?go-get=1 (status code 200)
get "golang.org/x/crypto/acme": found meta tag get.metaImport{Prefix:"golang.org/x/crypto", VCS:"git", RepoRoot:"https://go.googlesource.com/crypto"} at https://golang.org/x/crypto/acme?go-get=1
get "golang.org/x/crypto/acme": verifying non-authoritative meta tag
github.com/lunny/log (download)
github.com/lunny/tango (download)
github.com/mailgun/route (download)
github.com/vulcand/predicate (download)
github.com/gravitational/trace (download)
github.com/jonboulle/clockwork (download)
github.com/sirupsen/logrus (download)
Fetching https://golang.org/x/crypto/ssh/terminal?go-get=1
Parsing meta tags from https://golang.org/x/crypto/ssh/terminal?go-get=1 (status code 200)
get "golang.org/x/crypto/ssh/terminal": found meta tag get.metaImport{Prefix:"golang.org/x/crypto", VCS:"git", RepoRoot:"https://go.googlesource.com/crypto"} at https://golang.org/x/crypto/ssh/terminal?go-get=1
get "golang.org/x/crypto/ssh/terminal": verifying non-authoritative meta tag
Fetching https://golang.org/x/sys/unix?go-get=1
Parsing meta tags from https://golang.org/x/sys/unix?go-get=1 (status code 200)
get "golang.org/x/sys/unix": found meta tag get.metaImport{Prefix:"golang.org/x/sys", VCS:"git", RepoRoot:"https://go.googlesource.com/sys"} at https://golang.org/x/sys/unix?go-get=1
get "golang.org/x/sys/unix": verifying non-authoritative meta tag
Fetching https://golang.org/x/sys?go-get=1
Parsing meta tags from https://golang.org/x/sys?go-get=1 (status code 200)
golang.org/x/sys (download)
Fetching https://golang.org/x/net/context?go-get=1
Parsing meta tags from https://golang.org/x/net/context?go-get=1 (status code 200)
get "golang.org/x/net/context": found meta tag get.metaImport{Prefix:"golang.org/x/net", VCS:"git", RepoRoot:"https://go.googlesource.com/net"} at https://golang.org/x/net/context?go-get=1
get "golang.org/x/net/context": verifying non-authoritative meta tag
Fetching https://golang.org/x/net?go-get=1
Parsing meta tags from https://golang.org/x/net?go-get=1 (status code 200)
golang.org/x/net (download)
github.com/mikespook/possum (download)
Fetching https://gopkg.in/fsnotify.v1?go-get=1
Parsing meta tags from https://gopkg.in/fsnotify.v1?go-get=1 (status code 200)
get "gopkg.in/fsnotify.v1": found meta tag get.metaImport{Prefix:"gopkg.in/fsnotify.v1", VCS:"git", RepoRoot:"https://gopkg.in/fsnotify.v1"} at https://gopkg.in/fsnotify.v1?go-get=1
gopkg.in/fsnotify.v1 (download)
Fetching https://golang.org/x/net/websocket?go-get=1
Parsing meta tags from https://golang.org/x/net/websocket?go-get=1 (status code 200)
get "golang.org/x/net/websocket": found meta tag get.metaImport{Prefix:"golang.org/x/net", VCS:"git", RepoRoot:"https://go.googlesource.com/net"} at https://golang.org/x/net/websocket?go-get=1
get "golang.org/x/net/websocket": verifying non-authoritative meta tag
github.com/naoina/denco (download)
github.com/naoina/kocha-urlrouter (download)
github.com/pilu/traffic (download)
github.com/pilu/config (download)
github.com/plimble/ace (download)
github.com/plimble/sessions (download)
github.com/oxtoacart/bpool (download)
github.com/satori/go.uuid (download)
github.com/tinylib/msgp (download)
github.com/philhofer/fwd (download)
github.com/plimble/utils (download)
github.com/rcrowley/go-tigertonic (download)
github.com/rcrowley/go-metrics (download)
github.com/revel/revel (download)
github.com/revel/config (download)
github.com/revel/log15 (download)
github.com/inconshreveable/log15 (download)
Fetching https://gopkg.in/stack.v0?go-get=1
Parsing meta tags from https://gopkg.in/stack.v0?go-get=1 (status code 200)
get "gopkg.in/stack.v0": found meta tag get.metaImport{Prefix:"gopkg.in/stack.v0", VCS:"git", RepoRoot:"https://gopkg.in/stack.v0"} at https://gopkg.in/stack.v0?go-get=1
gopkg.in/stack.v0 (download)
github.com/revel/pathtree (download)
Fetching https://gopkg.in/natefinch/lumberjack.v2?go-get=1
Parsing meta tags from https://gopkg.in/natefinch/lumberjack.v2?go-get=1 (status code 200)
get "gopkg.in/natefinch/lumberjack.v2": found meta tag get.metaImport{Prefix:"gopkg.in/natefinch/lumberjack.v2", VCS:"git", RepoRoot:"https://gopkg.in/natefinch/lumberjack.v2"} at https://gopkg.in/natefinch/lumberjack.v2?go-get=1
gopkg.in/natefinch/lumberjack.v2 (download)
github.com/xeonx/timeago (download)
Fetching https://gopkg.in/fsnotify/fsnotify.v1?go-get=1
Parsing meta tags from https://gopkg.in/fsnotify/fsnotify.v1?go-get=1 (status code 200)
get "gopkg.in/fsnotify/fsnotify.v1": found meta tag get.metaImport{Prefix:"gopkg.in/fsnotify/fsnotify.v1", VCS:"git", RepoRoot:"https://gopkg.in/fsnotify/fsnotify.v1"} at https://gopkg.in/fsnotify/fsnotify.v1?go-get=1
gopkg.in/fsnotify/fsnotify.v1 (download)
github.com/robfig/pathtree (download)
github.com/typepress/rivet (download)
github.com/ursiform/bear (download)
github.com/vanng822/r2router (download)
github.com/zenazn/goji (download)
Fetching https://goji.io?go-get=1
Parsing meta tags from https://goji.io?go-get=1 (status code 200)
get "goji.io": found meta tag get.metaImport{Prefix:"goji.io", VCS:"git", RepoRoot:"https://github.com/goji/goji"} at https://goji.io?go-get=1
goji.io (download)
Fetching https://goji.io/internal?go-get=1
Parsing meta tags from https://goji.io/internal?go-get=1 (status code 200)
get "goji.io/internal": found meta tag get.metaImport{Prefix:"goji.io", VCS:"git", RepoRoot:"https://github.com/goji/goji"} at https://goji.io/internal?go-get=1
get "goji.io/internal": verifying non-authoritative meta tag
Fetching https://goji.io?go-get=1
Parsing meta tags from https://goji.io?go-get=1 (status code 200)
Fetching https://goji.io/pat?go-get=1
Parsing meta tags from https://goji.io/pat?go-get=1 (status code 200)
get "goji.io/pat": found meta tag get.metaImport{Prefix:"goji.io", VCS:"git", RepoRoot:"https://github.com/goji/goji"} at https://goji.io/pat?go-get=1
get "goji.io/pat": verifying non-authoritative meta tag
Fetching https://goji.io/pattern?go-get=1
Parsing meta tags from https://goji.io/pattern?go-get=1 (status code 200)
get "goji.io/pattern": found meta tag get.metaImport{Prefix:"goji.io", VCS:"git", RepoRoot:"https://github.com/goji/goji"} at https://goji.io/pattern?go-get=1
get "goji.io/pattern": verifying non-authoritative meta tag
github.com/julienschmidt/go-http-routing-benchmark
# github.com/julienschmidt/go-http-routing-benchmark
./routers.go:1151:33: rc.Controller.Request.RequestURI undefined (type *revel.Request has no field or method RequestURI)
./routers.go:1167:27: cannot use r (type *http.Request) as type revel.ServerRequest in argument to revel.NewRequest:
	*http.Request does not implement revel.ServerRequest (missing Get method)
./routers.go:1168:28: cannot use w (type http.ResponseWriter) as type revel.ServerResponse in argument to revel.NewResponse:
	http.ResponseWriter does not implement revel.ServerResponse (missing Get method)
./routers.go:1169:30: too many arguments in call to revel.NewController
	have (*revel.Request, *revel.Response)
	want (revel.ServerContext)
./routers.go:1171:6: req.Websocket undefined (type *revel.Request has no field or method Websocket, but does have WebSocket)
./routers.go:1179:23: invalid type assertion: resp.Out.(io.Closer) (non-interface type revel.OutResponse on left)
./routers.go:1218:33: not enough arguments in call to revel.NewRoute
	have (string, string, string, string, string, number)
	want (*revel.Module, string, string, string, string, string, int)
./routers.go:1223:14: cannot use "github.com/robfig/pathtree".New() (type *"github.com/robfig/pathtree".Node) as type *"github.com/revel/pathtree".Node in assignment
./routers.go:1244:25: not enough arguments in call to revel.NewRoute
	have (string, string, string, string, string, number)
	want (*revel.Module, string, string, string, string, string, int)

Beego API has changed

The line beego.RunMode = "prod" has been changed to beego.BConfig.RunMode = beego.PROD. This causes the tests to fail and the benchmark to not run.

Macaron?

Hi, Macaron seems to be a popular framework,
perhaps you could add that to this great resource?
Thanks!

Testing of Zeus failed

Running go test -bench=. -timeout=20m but failed:

--- FAIL: TestRouters (2.72s)
    routers_test.go:78: Zeus in API Static: 301 - <a href="/articles">Moved Permanently</a>.

        ; expected GET /articles/
    routers_test.go:78: Zeus in API Static: 301 - <a href="/articles/wiki">Moved Permanently</a>.

        ; expected GET /articles/wiki/
    routers_test.go:78: Zeus in API Static: 301 - <a href="/codewalk">Moved Permanently</a>.

        ; expected GET /codewalk/
    routers_test.go:78: Zeus in API Static: 301 - <a href="/devel">Moved Permanently</a>.

        ; expected GET /devel/
    routers_test.go:78: Zeus in API Static: 301 - <a href="/gopher">Moved Permanently</a>.

        ; expected GET /gopher/
    routers_test.go:78: Zeus in API Static: 301 - <a href="/gopher/pencil">Moved Permanently</a>.

        ; expected GET /gopher/pencil/
    routers_test.go:78: Zeus in API Static: 301 - <a href="/play">Moved Permanently</a>.

        ; expected GET /play/
    routers_test.go:78: Zeus in API Static: 301 - <a href="/progs">Moved Permanently</a>.

        ; expected GET /progs/

I'd like to make a PR, but I am not familiar with Zeus.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.