From 653e6856ea1cfc60cc16733807d23b302dbe4bd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Fri, 11 Oct 2019 13:55:46 +0200 Subject: resources/page: Use binary search in Pages.Prev/Next if possible MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is obviously much faster for lager data sets: ```bash name old time/op new time/op delta SearchPage/ByWeight-100-4 267ns ± 4% 272ns ± 5% ~ (p=0.457 n=4+4) SearchPage/ByWeight-5000-4 10.8µs ± 3% 1.2µs ± 2% -88.99% (p=0.029 n=4+4) SearchPage/ByWeight-10000-4 21.1µs ± 1% 1.4µs ±11% -93.28% (p=0.029 n=4+4) ``` See #4500 --- resources/page/pages_prev_next.go | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) (limited to 'resources/page/pages_prev_next.go') diff --git a/resources/page/pages_prev_next.go b/resources/page/pages_prev_next.go index dd87aa4ce..dd767c667 100644 --- a/resources/page/pages_prev_next.go +++ b/resources/page/pages_prev_next.go @@ -15,26 +15,21 @@ package page // Next returns the next page reletive to the given func (p Pages) Next(cur Page) Page { - for x, c := range p { - if c.Eq(cur) { - if x == 0 { - return nil - } - return p[x-1] - } + x := searchPage(cur, p) + if x <= 0 { + return nil } - return nil + return p[x-1] } // Prev returns the previous page reletive to the given func (p Pages) Prev(cur Page) Page { - for x, c := range p { - if c.Eq(cur) { - if x < len(p)-1 { - return p[x+1] - } - return nil - } + x := searchPage(cur, p) + + if x == -1 || len(p)-x < 2 { + return nil } - return nil + + return p[x+1] + } -- cgit v1.2.3