mirror of
https://github.com/PuerkitoBio/goquery
synced 2025-12-24 12:38:00 +08:00
reuse the deduplication set map in mapNodes
This commit is contained in:
85
bench/v1.0.1b-go1.7
Normal file
85
bench/v1.0.1b-go1.7
Normal file
@@ -0,0 +1,85 @@
|
||||
BenchmarkFirst-4 30000000 51.8 ns/op 48 B/op 1 allocs/op
|
||||
BenchmarkLast-4 30000000 50.1 ns/op 48 B/op 1 allocs/op
|
||||
BenchmarkEq-4 30000000 51.4 ns/op 48 B/op 1 allocs/op
|
||||
BenchmarkSlice-4 500000000 3.52 ns/op 0 B/op 0 allocs/op
|
||||
BenchmarkGet-4 2000000000 1.65 ns/op 0 B/op 0 allocs/op
|
||||
BenchmarkIndex-4 2000000 787 ns/op 248 B/op 10 allocs/op
|
||||
BenchmarkIndexSelector-4 100000 16952 ns/op 3839 B/op 21 allocs/op
|
||||
BenchmarkIndexOfNode-4 200000000 6.42 ns/op 0 B/op 0 allocs/op
|
||||
BenchmarkIndexOfSelection-4 200000000 7.12 ns/op 0 B/op 0 allocs/op
|
||||
BenchmarkMetalReviewExample-4 10000 141994 ns/op 12418 B/op 320 allocs/op
|
||||
BenchmarkAdd-4 200000 10367 ns/op 208 B/op 9 allocs/op
|
||||
BenchmarkAddSelection-4 10000000 152 ns/op 48 B/op 1 allocs/op
|
||||
BenchmarkAddNodes-4 10000000 147 ns/op 48 B/op 1 allocs/op
|
||||
BenchmarkAndSelf-4 1000000 1647 ns/op 1008 B/op 5 allocs/op
|
||||
BenchmarkFilter-4 100000 19522 ns/op 360 B/op 8 allocs/op
|
||||
BenchmarkNot-4 100000 22546 ns/op 136 B/op 5 allocs/op
|
||||
BenchmarkFilterFunction-4 50000 35087 ns/op 22976 B/op 755 allocs/op
|
||||
BenchmarkNotFunction-4 50000 39123 ns/op 29120 B/op 757 allocs/op
|
||||
BenchmarkFilterNodes-4 50000 34890 ns/op 20960 B/op 749 allocs/op
|
||||
BenchmarkNotNodes-4 30000 41145 ns/op 29120 B/op 757 allocs/op
|
||||
BenchmarkFilterSelection-4 50000 33735 ns/op 20960 B/op 749 allocs/op
|
||||
BenchmarkNotSelection-4 30000 41334 ns/op 29120 B/op 757 allocs/op
|
||||
BenchmarkHas-4 5000 264058 ns/op 2370 B/op 50 allocs/op
|
||||
BenchmarkHasNodes-4 10000 151718 ns/op 21184 B/op 752 allocs/op
|
||||
BenchmarkHasSelection-4 10000 156955 ns/op 21184 B/op 752 allocs/op
|
||||
BenchmarkEnd-4 2000000000 1.01 ns/op 0 B/op 0 allocs/op
|
||||
BenchmarkEach-4 300000 4660 ns/op 3304 B/op 118 allocs/op
|
||||
BenchmarkMap-4 200000 8404 ns/op 5572 B/op 184 allocs/op
|
||||
BenchmarkEachWithBreak-4 2000000 806 ns/op 560 B/op 20 allocs/op
|
||||
BenchmarkAttr-4 100000000 21.6 ns/op 0 B/op 0 allocs/op
|
||||
BenchmarkText-4 200000 8911 ns/op 7536 B/op 110 allocs/op
|
||||
BenchmarkLength-4 2000000000 0.34 ns/op 0 B/op 0 allocs/op
|
||||
BenchmarkHtml-4 3000000 405 ns/op 120 B/op 2 allocs/op
|
||||
BenchmarkIs-4 100000 22228 ns/op 88 B/op 4 allocs/op
|
||||
BenchmarkIsPositional-4 50000 26469 ns/op 1112 B/op 10 allocs/op
|
||||
BenchmarkIsFunction-4 1000000 1240 ns/op 784 B/op 28 allocs/op
|
||||
BenchmarkIsSelection-4 50000 33709 ns/op 20960 B/op 749 allocs/op
|
||||
BenchmarkIsNodes-4 50000 33711 ns/op 20960 B/op 749 allocs/op
|
||||
BenchmarkHasClass-4 10000 236005 ns/op 14944 B/op 976 allocs/op
|
||||
BenchmarkContains-4 200000000 7.47 ns/op 0 B/op 0 allocs/op
|
||||
BenchmarkFind-4 100000 16075 ns/op 3839 B/op 21 allocs/op
|
||||
BenchmarkFindWithinSelection-4 30000 41418 ns/op 3539 B/op 82 allocs/op
|
||||
BenchmarkFindSelection-4 10000 209490 ns/op 5616 B/op 89 allocs/op
|
||||
BenchmarkFindNodes-4 10000 208206 ns/op 5614 B/op 89 allocs/op
|
||||
BenchmarkContents-4 300000 4751 ns/op 1420 B/op 36 allocs/op
|
||||
BenchmarkContentsFiltered-4 300000 5454 ns/op 1570 B/op 41 allocs/op
|
||||
BenchmarkChildren-4 3000000 527 ns/op 152 B/op 7 allocs/op
|
||||
BenchmarkChildrenFiltered-4 1000000 2484 ns/op 352 B/op 15 allocs/op
|
||||
BenchmarkParent-4 50000 34724 ns/op 6940 B/op 387 allocs/op
|
||||
BenchmarkParentFiltered-4 50000 35596 ns/op 7141 B/op 394 allocs/op
|
||||
BenchmarkParents-4 20000 62094 ns/op 30720 B/op 837 allocs/op
|
||||
BenchmarkParentsFiltered-4 20000 63223 ns/op 31304 B/op 845 allocs/op
|
||||
BenchmarkParentsUntil-4 50000 30391 ns/op 11828 B/op 358 allocs/op
|
||||
BenchmarkParentsUntilSelection-4 20000 99962 ns/op 54075 B/op 1523 allocs/op
|
||||
BenchmarkParentsUntilNodes-4 20000 98763 ns/op 54073 B/op 1523 allocs/op
|
||||
BenchmarkParentsFilteredUntil-4 200000 7982 ns/op 2787 B/op 88 allocs/op
|
||||
BenchmarkParentsFilteredUntilSelection-4 100000 13618 ns/op 5995 B/op 192 allocs/op
|
||||
BenchmarkParentsFilteredUntilNodes-4 100000 13639 ns/op 5994 B/op 192 allocs/op
|
||||
BenchmarkSiblings-4 20000 75287 ns/op 28453 B/op 225 allocs/op
|
||||
BenchmarkSiblingsFiltered-4 20000 80139 ns/op 29543 B/op 234 allocs/op
|
||||
BenchmarkNext-4 100000 14270 ns/op 4659 B/op 117 allocs/op
|
||||
BenchmarkNextFiltered-4 100000 15352 ns/op 4860 B/op 123 allocs/op
|
||||
BenchmarkNextAll-4 20000 60811 ns/op 22771 B/op 157 allocs/op
|
||||
BenchmarkNextAllFiltered-4 20000 69079 ns/op 23871 B/op 166 allocs/op
|
||||
BenchmarkPrev-4 100000 14417 ns/op 4659 B/op 117 allocs/op
|
||||
BenchmarkPrevFiltered-4 100000 15443 ns/op 4859 B/op 123 allocs/op
|
||||
BenchmarkPrevAll-4 100000 22008 ns/op 7346 B/op 120 allocs/op
|
||||
BenchmarkPrevAllFiltered-4 100000 23212 ns/op 7544 B/op 126 allocs/op
|
||||
BenchmarkNextUntil-4 50000 30589 ns/op 8767 B/op 267 allocs/op
|
||||
BenchmarkNextUntilSelection-4 30000 40875 ns/op 19862 B/op 546 allocs/op
|
||||
BenchmarkNextUntilNodes-4 100000 15987 ns/op 8134 B/op 249 allocs/op
|
||||
BenchmarkPrevUntil-4 20000 98799 ns/op 25727 B/op 467 allocs/op
|
||||
BenchmarkPrevUntilSelection-4 30000 51874 ns/op 24875 B/op 694 allocs/op
|
||||
BenchmarkPrevUntilNodes-4 100000 12901 ns/op 6334 B/op 204 allocs/op
|
||||
BenchmarkNextFilteredUntil-4 100000 19869 ns/op 5909 B/op 177 allocs/op
|
||||
BenchmarkNextFilteredUntilSelection-4 30000 45412 ns/op 20557 B/op 571 allocs/op
|
||||
BenchmarkNextFilteredUntilNodes-4 30000 45363 ns/op 20557 B/op 571 allocs/op
|
||||
BenchmarkPrevFilteredUntil-4 100000 19357 ns/op 6033 B/op 179 allocs/op
|
||||
BenchmarkPrevFilteredUntilSelection-4 30000 46396 ns/op 21305 B/op 591 allocs/op
|
||||
BenchmarkPrevFilteredUntilNodes-4 30000 46133 ns/op 21305 B/op 591 allocs/op
|
||||
BenchmarkClosest-4 500000 3448 ns/op 160 B/op 8 allocs/op
|
||||
BenchmarkClosestSelection-4 3000000 528 ns/op 96 B/op 6 allocs/op
|
||||
BenchmarkClosestNodes-4 3000000 523 ns/op 96 B/op 6 allocs/op
|
||||
PASS
|
||||
ok github.com/PuerkitoBio/goquery 162.012s
|
||||
@@ -35,7 +35,7 @@ func (s *Selection) Union(sel *Selection) *Selection {
|
||||
// AddNodes adds the specified nodes to those in the
|
||||
// current selection and returns a new Selection object.
|
||||
func (s *Selection) AddNodes(nodes ...*html.Node) *Selection {
|
||||
return pushStack(s, appendWithoutDuplicates(s.Nodes, nodes))
|
||||
return pushStack(s, appendWithoutDuplicates(s.Nodes, nodes, nil))
|
||||
}
|
||||
|
||||
// AndSelf adds the previous set of elements on the stack to the current set.
|
||||
|
||||
@@ -684,10 +684,13 @@ func getParentNodes(nodes []*html.Node) []*html.Node {
|
||||
// Returns an array of nodes mapped by calling the callback function once for
|
||||
// each node in the source nodes.
|
||||
func mapNodes(nodes []*html.Node, f func(int, *html.Node) []*html.Node) (result []*html.Node) {
|
||||
var set map[*html.Node]bool
|
||||
|
||||
set = make(map[*html.Node]bool)
|
||||
for i, n := range nodes {
|
||||
if vals := f(i, n); len(vals) > 0 {
|
||||
result = appendWithoutDuplicates(result, vals)
|
||||
result = appendWithoutDuplicates(result, vals, set)
|
||||
}
|
||||
}
|
||||
return
|
||||
return result
|
||||
}
|
||||
|
||||
24
utilities.go
24
utilities.go
@@ -112,11 +112,25 @@ func indexInSlice(slice []*html.Node, node *html.Node) int {
|
||||
// Appends the new nodes to the target slice, making sure no duplicate is added.
|
||||
// There is no check to the original state of the target slice, so it may still
|
||||
// contain duplicates. The target slice is returned because append() may create
|
||||
// a new underlying array.
|
||||
func appendWithoutDuplicates(target []*html.Node, nodes []*html.Node) []*html.Node {
|
||||
targetSet := make(map[*html.Node]bool, len(target))
|
||||
for _, n := range target {
|
||||
targetSet[n] = true
|
||||
// a new underlying array. If targetSet is nil, a local set is created with the
|
||||
// target if len(target) + len(nodes) is greater than minNodesForSet.
|
||||
func appendWithoutDuplicates(target []*html.Node, nodes []*html.Node, targetSet map[*html.Node]bool) []*html.Node {
|
||||
const minNodesForSet = 1000
|
||||
|
||||
if targetSet == nil && len(target)+len(nodes) < minNodesForSet {
|
||||
for _, n := range nodes {
|
||||
if !isInSlice(target, n) {
|
||||
target = append(target, n)
|
||||
}
|
||||
}
|
||||
return target
|
||||
}
|
||||
|
||||
if targetSet == nil {
|
||||
targetSet = make(map[*html.Node]bool, len(target))
|
||||
for _, n := range target {
|
||||
targetSet[n] = true
|
||||
}
|
||||
}
|
||||
for _, n := range nodes {
|
||||
if !targetSet[n] {
|
||||
|
||||
Reference in New Issue
Block a user