hugolib: Speed up GetPage
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 22 May 2017 22:20:31 +0000 (01:20 +0300)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Tue, 23 May 2017 12:18:26 +0000 (15:18 +0300)
When we know to look into the index pages collection, do that:

```
benchmark              old ns/op     new ns/op     delta
BenchmarkGetPage-4     51483         7072          -86.26%

benchmark              old allocs     new allocs     delta
BenchmarkGetPage-4     71             71             +0.00%

benchmark              old bytes     new bytes     delta
BenchmarkGetPage-4     2648          2648          +0.00%
```

This commit also returns an error if .Site.GetPage is called with the regular Page Kind, as that is currently not supported.

Fixes #3503

hugolib/page_collections.go
hugolib/site.go

index 3bf3132824c183b4c22ae55dc604c782587aea12..0cd432f48eb981c30e8b8e7cf145b227eea769d2 100644 (file)
@@ -51,8 +51,8 @@ func newPageCollectionsFromPages(pages Pages) *PageCollections {
        return &PageCollections{rawAllPages: pages}
 }
 
-func (c *PageCollections) getPage(typ string, path ...string) *Page {
-       pages := c.findPagesByKindIn(typ, c.Pages)
+func (c *PageCollections) getFirstPageMatchIn(ps Pages, typ string, path ...string) *Page {
+       pages := c.findPagesByKindIn(typ, ps)
 
        if len(pages) == 0 {
                return nil
@@ -78,6 +78,20 @@ func (c *PageCollections) getPage(typ string, path ...string) *Page {
        }
 
        return nil
+
+}
+
+func (c *PageCollections) getPage(typ string, path ...string) *Page {
+       var pages Pages
+
+       if typ == KindPage {
+               pages = c.RegularPages
+       } else {
+               pages = c.indexPages
+       }
+
+       return c.getFirstPageMatchIn(pages, typ, path...)
+
 }
 
 func (*PageCollections) findPagesByKindIn(kind string, inPages Pages) Pages {
index 45acd54cf7203b5891e9af836308c15207092de3..169c6cea4ff0436825e56025074643a9bcae7561 100644 (file)
@@ -1906,8 +1906,11 @@ func (s *Site) Stats() {
 // This will return nil when no page could be found.
 //
 // The valid page types are: home, section, taxonomy and taxonomyTerm
-func (s *SiteInfo) GetPage(typ string, path ...string) *Page {
-       return s.getPage(typ, path...)
+func (s *SiteInfo) GetPage(typ string, path ...string) (*Page, error) {
+       if typ == KindPage {
+               return nil, errors.New("GetPage not supported for regular pages")
+       }
+       return s.getPage(typ, path...), nil
 }
 
 func (s *Site) permalinkForOutputFormat(link string, f output.Format) (string, error) {