publisher: Fix memory usage in writeStats
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Fri, 27 Nov 2020 07:46:58 +0000 (08:46 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Fri, 27 Nov 2020 08:13:16 +0000 (09:13 +0100)
```
name                     old time/op    new time/op    delta
ClassCollectorWriter-16    72.1µs ± 0%    32.3µs ± 0%  -55.17%  (p=0.029 n=4+4)

name                     old alloc/op   new alloc/op   delta
ClassCollectorWriter-16    85.9kB ± 0%    35.1kB ± 0%  -59.16%  (p=0.029 n=4+4)

name                     old allocs/op  new allocs/op  delta
ClassCollectorWriter-16       329 ± 0%       149 ± 0%  -54.71%  (p=0.029 n=4+4)
```

Fixes #7945

publisher/htmlElementsCollector.go
publisher/htmlElementsCollector_test.go

index e2f8fd2ca241563da764aa61a507c4fb70515cb9..b9b0f4e117275a320468ea3d90b47fca36ea70c9 100644 (file)
@@ -122,12 +122,14 @@ func (w *cssClassCollectorWriter) Write(p []byte) (n int, err error) {
                                                continue
                                        }
 
+                                       key := s
+
                                        s, tagName := w.insertStandinHTMLElement(s)
                                        el := parseHTMLElement(s)
                                        el.Tag = tagName
 
                                        w.collector.mu.Lock()
-                                       w.collector.elementSet[s] = true
+                                       w.collector.elementSet[key] = true
                                        if el.Tag != "" {
                                                w.collector.elements = append(w.collector.elements, el)
                                        }
index 6b5ef98636ab654a088390d928a2b111c68a51b4..ab1529288586b1c2ebcfe16e64d58847be7613cf 100644 (file)
@@ -99,3 +99,30 @@ func TestClassCollector(t *testing.T) {
        }
 
 }
+
+func BenchmarkClassCollectorWriter(b *testing.B) {
+       const benchHTML = `
+<html>
+<body id="i1" class="a b c d">
+<a class="c d e"></a>
+<br>
+<a class="c d e"></a>
+<a class="c d e"></a>
+<br>
+<a id="i2" class="c d e f"></a>
+<a id="i3" class="c d e"></a>
+<a class="c d e"></a>
+<br>
+<a class="c d e"></a>
+<a class="c d e"></a>
+<a class="c d e"></a>
+<a class="c d e"></a>
+</body>
+</html>
+`
+       for i := 0; i < b.N; i++ {
+               w := newHTMLElementsCollectorWriter(newHTMLElementsCollector())
+               fmt.Fprint(w, benchHTML)
+
+       }
+}