diff --git a/README.md b/README.md index 9fc9b3f..736c2b7 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ To run benchmarks, run this command in goquery's source directory: ## Changelog -* **v0.2.0** : (*in progress on master branch*) Add support for negative indices in Slice(). **BREAKING CHANGE** `Document.Root` is removed, `Document` is now a `Selection` itself (a selection of one, the root element, just like `Document.Root` was before). *Upcoming* : add jQuery's Closest() method. +* **v0.2.0** : Add support for negative indices in Slice(). **BREAKING CHANGE** `Document.Root` is removed, `Document` is now a `Selection` itself (a selection of one, the root element, just like `Document.Root` was before). Add jQuery's Closest() method. * **v0.1.1** : Add benchmarks to use as baseline for refactorings, refactor Next...() and Prev...() methods to use the new html package's linked list features (Next/PrevSibling, FirstChild). Good performance boost (40+% in some cases). * **v0.1.0** : Initial release. diff --git a/bench/v0.2.0 b/bench/v0.2.0 new file mode 100644 index 0000000..3ea8dcb --- /dev/null +++ b/bench/v0.2.0 @@ -0,0 +1,459 @@ +PASS +BenchmarkFirst 20000000 94.3 ns/op +BenchmarkLast 20000000 94.7 ns/op +BenchmarkEq 20000000 93.7 ns/op +BenchmarkSlice 20000000 89.9 ns/op +BenchmarkGet 1000000000 2.72 ns/op +BenchmarkIndex 1000000 1834 ns/op +--- BENCH: BenchmarkIndex +bench_array_test.go:73: Index=3 +bench_array_test.go:73: Index=3 +bench_array_test.go:73: Index=3 +bench_array_test.go:73: Index=3 +BenchmarkIndexSelector 50000 53958 ns/op +--- BENCH: BenchmarkIndexSelector +bench_array_test.go:85: IndexSelector=4 +bench_array_test.go:85: IndexSelector=4 +bench_array_test.go:85: IndexSelector=4 +bench_array_test.go:85: IndexSelector=4 +BenchmarkIndexOfNode 100000000 10.1 ns/op +--- BENCH: BenchmarkIndexOfNode +bench_array_test.go:99: IndexOfNode=2 +bench_array_test.go:99: IndexOfNode=2 +bench_array_test.go:99: IndexOfNode=2 +bench_array_test.go:99: IndexOfNode=2 +bench_array_test.go:99: IndexOfNode=2 +BenchmarkIndexOfSelection 100000000 10.9 ns/op +--- BENCH: BenchmarkIndexOfSelection +bench_array_test.go:111: IndexOfSelection=2 +bench_array_test.go:111: IndexOfSelection=2 +bench_array_test.go:111: IndexOfSelection=2 +bench_array_test.go:111: IndexOfSelection=2 +bench_array_test.go:111: IndexOfSelection=2 +BenchmarkMetalReviewExample 5000 326712 ns/op +--- BENCH: BenchmarkMetalReviewExample +bench_example_test.go:40: Review 0: Midnight - Complete and Total Hell (8.5). + Review 1: Over Your Threshold - Facticity (6.0). + Review 2: Nuclear Death Terror - Chaos Reigns (7.5). + Review 3: Evoken - Atra Mors (9.5). + + bench_example_test.go:41: MetalReviewExample=10 +bench_example_test.go:40: Review 0: Midnight - Complete and Total Hell (8.5). + Review 1: Over Your Threshold - Facticity (6.0). + Review 2: Nuclear Death Terror - Chaos Reigns (7.5). + Review 3: Evoken - Atra Mors (9.5). + ... [output truncated] +BenchmarkAdd 50000 51776 ns/op +--- BENCH: BenchmarkAdd +bench_expand_test.go:20: Add=43 +bench_expand_test.go:20: Add=43 +bench_expand_test.go:20: Add=43 +bench_expand_test.go:20: Add=43 +BenchmarkAddSelection 10000000 196 ns/op +--- BENCH: BenchmarkAddSelection +bench_expand_test.go:37: AddSelection=43 +bench_expand_test.go:37: AddSelection=43 +bench_expand_test.go:37: AddSelection=43 +bench_expand_test.go:37: AddSelection=43 +bench_expand_test.go:37: AddSelection=43 +BenchmarkAddNodes 10000000 191 ns/op +--- BENCH: BenchmarkAddNodes +bench_expand_test.go:55: AddNodes=43 +bench_expand_test.go:55: AddNodes=43 +bench_expand_test.go:55: AddNodes=43 +bench_expand_test.go:55: AddNodes=43 +bench_expand_test.go:55: AddNodes=43 +BenchmarkAndSelf 1000000 2495 ns/op +--- BENCH: BenchmarkAndSelf +bench_expand_test.go:71: AndSelf=44 +bench_expand_test.go:71: AndSelf=44 +bench_expand_test.go:71: AndSelf=44 +bench_expand_test.go:71: AndSelf=44 +BenchmarkFilter 50000 30974 ns/op +--- BENCH: BenchmarkFilter +bench_filter_test.go:20: Filter=13 +bench_filter_test.go:20: Filter=13 +bench_filter_test.go:20: Filter=13 +bench_filter_test.go:20: Filter=13 +BenchmarkNot 50000 35322 ns/op +--- BENCH: BenchmarkNot +bench_filter_test.go:36: Not=371 +bench_filter_test.go:36: Not=371 +bench_filter_test.go:36: Not=371 +bench_filter_test.go:36: Not=371 +BenchmarkFilterFunction 50000 65644 ns/op +--- BENCH: BenchmarkFilterFunction +bench_filter_test.go:55: FilterFunction=112 +bench_filter_test.go:55: FilterFunction=112 +bench_filter_test.go:55: FilterFunction=112 +bench_filter_test.go:55: FilterFunction=112 +BenchmarkNotFunction 50000 69245 ns/op +--- BENCH: BenchmarkNotFunction +bench_filter_test.go:74: NotFunction=261 +bench_filter_test.go:74: NotFunction=261 +bench_filter_test.go:74: NotFunction=261 +bench_filter_test.go:74: NotFunction=261 +BenchmarkFilterNodes 50000 64824 ns/op +--- BENCH: BenchmarkFilterNodes +bench_filter_test.go:92: FilterNodes=2 +bench_filter_test.go:92: FilterNodes=2 +bench_filter_test.go:92: FilterNodes=2 +bench_filter_test.go:92: FilterNodes=2 +BenchmarkNotNodes 20000 76247 ns/op +--- BENCH: BenchmarkNotNodes +bench_filter_test.go:110: NotNodes=360 +bench_filter_test.go:110: NotNodes=360 +bench_filter_test.go:110: NotNodes=360 +bench_filter_test.go:110: NotNodes=360 +BenchmarkFilterSelection 50000 66154 ns/op +--- BENCH: BenchmarkFilterSelection +bench_filter_test.go:127: FilterSelection=2 +bench_filter_test.go:127: FilterSelection=2 +bench_filter_test.go:127: FilterSelection=2 +bench_filter_test.go:127: FilterSelection=2 +BenchmarkNotSelection 20000 76336 ns/op +--- BENCH: BenchmarkNotSelection +bench_filter_test.go:144: NotSelection=360 +bench_filter_test.go:144: NotSelection=360 +bench_filter_test.go:144: NotSelection=360 +bench_filter_test.go:144: NotSelection=360 +BenchmarkHas 5000 569495 ns/op +--- BENCH: BenchmarkHas +bench_filter_test.go:160: Has=13 +bench_filter_test.go:160: Has=13 +bench_filter_test.go:160: Has=13 +BenchmarkHasNodes 10000 227059 ns/op +--- BENCH: BenchmarkHasNodes +bench_filter_test.go:178: HasNodes=15 +bench_filter_test.go:178: HasNodes=15 +bench_filter_test.go:178: HasNodes=15 +BenchmarkHasSelection 10000 227167 ns/op +--- BENCH: BenchmarkHasSelection +bench_filter_test.go:195: HasSelection=15 +bench_filter_test.go:195: HasSelection=15 +bench_filter_test.go:195: HasSelection=15 +BenchmarkEnd 500000000 3.99 ns/op +--- BENCH: BenchmarkEnd +bench_filter_test.go:211: End=373 +bench_filter_test.go:211: End=373 +bench_filter_test.go:211: End=373 +bench_filter_test.go:211: End=373 +bench_filter_test.go:211: End=373 +bench_filter_test.go:211: End=373 +BenchmarkEach 200000 9354 ns/op +--- BENCH: BenchmarkEach +bench_iteration_test.go:22: Each=59 +bench_iteration_test.go:22: Each=59 +bench_iteration_test.go:22: Each=59 +bench_iteration_test.go:22: Each=59 +BenchmarkMap 100000 16557 ns/op +--- BENCH: BenchmarkMap +bench_iteration_test.go:41: Map=59 +bench_iteration_test.go:41: Map=59 +bench_iteration_test.go:41: Map=59 +bench_iteration_test.go:41: Map=59 +BenchmarkAttr 50000000 36.4 ns/op +--- BENCH: BenchmarkAttr +bench_property_test.go:16: Attr=firstHeading +bench_property_test.go:16: Attr=firstHeading +bench_property_test.go:16: Attr=firstHeading +bench_property_test.go:16: Attr=firstHeading +bench_property_test.go:16: Attr=firstHeading +BenchmarkText 100000 18473 ns/op +BenchmarkLength 2000000000 0.76 ns/op +--- BENCH: BenchmarkLength +bench_property_test.go:37: Length=14 +bench_property_test.go:37: Length=14 +bench_property_test.go:37: Length=14 +bench_property_test.go:37: Length=14 +bench_property_test.go:37: Length=14 +bench_property_test.go:37: Length=14 +BenchmarkHtml 5000000 666 ns/op +BenchmarkIs 50000 35174 ns/op +--- BENCH: BenchmarkIs +bench_query_test.go:16: Is=true +bench_query_test.go:16: Is=true +bench_query_test.go:16: Is=true +bench_query_test.go:16: Is=true +BenchmarkIsPositional 50000 31814 ns/op +--- BENCH: BenchmarkIsPositional +bench_query_test.go:28: IsPositional=true +bench_query_test.go:28: IsPositional=true +bench_query_test.go:28: IsPositional=true +bench_query_test.go:28: IsPositional=true +BenchmarkIsFunction 1000000 2754 ns/op +--- BENCH: BenchmarkIsFunction +bench_query_test.go:43: IsFunction=true +bench_query_test.go:43: IsFunction=true +bench_query_test.go:43: IsFunction=true +bench_query_test.go:43: IsFunction=true +BenchmarkIsSelection 50000 66260 ns/op +--- BENCH: BenchmarkIsSelection +bench_query_test.go:56: IsSelection=true +bench_query_test.go:56: IsSelection=true +bench_query_test.go:56: IsSelection=true +bench_query_test.go:56: IsSelection=true +BenchmarkIsNodes 50000 64682 ns/op +--- BENCH: BenchmarkIsNodes +bench_query_test.go:70: IsNodes=true +bench_query_test.go:70: IsNodes=true +bench_query_test.go:70: IsNodes=true +bench_query_test.go:70: IsNodes=true +BenchmarkHasClass 5000 672953 ns/op +--- BENCH: BenchmarkHasClass +bench_query_test.go:82: HasClass=true +bench_query_test.go:82: HasClass=true +bench_query_test.go:82: HasClass=true +BenchmarkContains 100000000 11.3 ns/op +--- BENCH: BenchmarkContains +bench_query_test.go:96: Contains=true +bench_query_test.go:96: Contains=true +bench_query_test.go:96: Contains=true +bench_query_test.go:96: Contains=true +bench_query_test.go:96: Contains=true +BenchmarkFind 50000 53780 ns/op +--- BENCH: BenchmarkFind +bench_traversal_test.go:18: Find=41 +bench_traversal_test.go:18: Find=41 +bench_traversal_test.go:18: Find=41 +bench_traversal_test.go:18: Find=41 +BenchmarkFindWithinSelection 10000 125963 ns/op +--- BENCH: BenchmarkFindWithinSelection +bench_traversal_test.go:34: FindWithinSelection=39 +bench_traversal_test.go:34: FindWithinSelection=39 +bench_traversal_test.go:34: FindWithinSelection=39 +BenchmarkFindSelection 5000 357318 ns/op +--- BENCH: BenchmarkFindSelection +bench_traversal_test.go:51: FindSelection=73 +bench_traversal_test.go:51: FindSelection=73 +bench_traversal_test.go:51: FindSelection=73 +BenchmarkFindNodes 5000 357587 ns/op +--- BENCH: BenchmarkFindNodes +bench_traversal_test.go:69: FindNodes=73 +bench_traversal_test.go:69: FindNodes=73 +bench_traversal_test.go:69: FindNodes=73 +BenchmarkContents 200000 9135 ns/op +--- BENCH: BenchmarkContents +bench_traversal_test.go:85: Contents=16 +bench_traversal_test.go:85: Contents=16 +bench_traversal_test.go:85: Contents=16 +bench_traversal_test.go:85: Contents=16 +BenchmarkContentsFiltered 200000 12383 ns/op +--- BENCH: BenchmarkContentsFiltered +bench_traversal_test.go:101: ContentsFiltered=1 +bench_traversal_test.go:101: ContentsFiltered=1 +bench_traversal_test.go:101: ContentsFiltered=1 +bench_traversal_test.go:101: ContentsFiltered=1 +BenchmarkChildren 1000000 1809 ns/op +--- BENCH: BenchmarkChildren +bench_traversal_test.go:117: Children=2 +bench_traversal_test.go:117: Children=2 +bench_traversal_test.go:117: Children=2 +bench_traversal_test.go:117: Children=2 +BenchmarkChildrenFiltered 500000 5814 ns/op +--- BENCH: BenchmarkChildrenFiltered +bench_traversal_test.go:133: ChildrenFiltered=2 +bench_traversal_test.go:133: ChildrenFiltered=2 +bench_traversal_test.go:133: ChildrenFiltered=2 +bench_traversal_test.go:133: ChildrenFiltered=2 +BenchmarkParent 50000 44810 ns/op +--- BENCH: BenchmarkParent +bench_traversal_test.go:149: Parent=55 +bench_traversal_test.go:149: Parent=55 +bench_traversal_test.go:149: Parent=55 +bench_traversal_test.go:149: Parent=55 +BenchmarkParentFiltered 50000 48795 ns/op +--- BENCH: BenchmarkParentFiltered +bench_traversal_test.go:165: ParentFiltered=4 +bench_traversal_test.go:165: ParentFiltered=4 +bench_traversal_test.go:165: ParentFiltered=4 +bench_traversal_test.go:165: ParentFiltered=4 +BenchmarkParents 20000 89102 ns/op +--- BENCH: BenchmarkParents +bench_traversal_test.go:181: Parents=73 +bench_traversal_test.go:181: Parents=73 +bench_traversal_test.go:181: Parents=73 +bench_traversal_test.go:181: Parents=73 +BenchmarkParentsFiltered 20000 93953 ns/op +--- BENCH: BenchmarkParentsFiltered +bench_traversal_test.go:197: ParentsFiltered=18 +bench_traversal_test.go:197: ParentsFiltered=18 +bench_traversal_test.go:197: ParentsFiltered=18 +bench_traversal_test.go:197: ParentsFiltered=18 +BenchmarkParentsUntil 10000 130783 ns/op +--- BENCH: BenchmarkParentsUntil +bench_traversal_test.go:213: ParentsUntil=52 +bench_traversal_test.go:213: ParentsUntil=52 +bench_traversal_test.go:213: ParentsUntil=52 +BenchmarkParentsUntilSelection 10000 231797 ns/op +--- BENCH: BenchmarkParentsUntilSelection +bench_traversal_test.go:230: ParentsUntilSelection=70 +bench_traversal_test.go:230: ParentsUntilSelection=70 +bench_traversal_test.go:230: ParentsUntilSelection=70 +BenchmarkParentsUntilNodes 10000 233761 ns/op +--- BENCH: BenchmarkParentsUntilNodes +bench_traversal_test.go:248: ParentsUntilNodes=70 +bench_traversal_test.go:248: ParentsUntilNodes=70 +bench_traversal_test.go:248: ParentsUntilNodes=70 +BenchmarkParentsFilteredUntil 50000 31360 ns/op +--- BENCH: BenchmarkParentsFilteredUntil +bench_traversal_test.go:264: ParentsFilteredUntil=2 +bench_traversal_test.go:264: ParentsFilteredUntil=2 +bench_traversal_test.go:264: ParentsFilteredUntil=2 +bench_traversal_test.go:264: ParentsFilteredUntil=2 +BenchmarkParentsFilteredUntilSelection 50000 30272 ns/op +--- BENCH: BenchmarkParentsFilteredUntilSelection +bench_traversal_test.go:281: ParentsFilteredUntilSelection=2 +bench_traversal_test.go:281: ParentsFilteredUntilSelection=2 +bench_traversal_test.go:281: ParentsFilteredUntilSelection=2 +bench_traversal_test.go:281: ParentsFilteredUntilSelection=2 +BenchmarkParentsFilteredUntilNodes 50000 30327 ns/op +--- BENCH: BenchmarkParentsFilteredUntilNodes +bench_traversal_test.go:299: ParentsFilteredUntilNodes=2 +bench_traversal_test.go:299: ParentsFilteredUntilNodes=2 +bench_traversal_test.go:299: ParentsFilteredUntilNodes=2 +bench_traversal_test.go:299: ParentsFilteredUntilNodes=2 +BenchmarkSiblings 20000 89862 ns/op +--- BENCH: BenchmarkSiblings +bench_traversal_test.go:315: Siblings=293 +bench_traversal_test.go:315: Siblings=293 +bench_traversal_test.go:315: Siblings=293 +bench_traversal_test.go:315: Siblings=293 +BenchmarkSiblingsFiltered 20000 97948 ns/op +--- BENCH: BenchmarkSiblingsFiltered +bench_traversal_test.go:331: SiblingsFiltered=46 +bench_traversal_test.go:331: SiblingsFiltered=46 +bench_traversal_test.go:331: SiblingsFiltered=46 +bench_traversal_test.go:331: SiblingsFiltered=46 +BenchmarkNext 50000 31975 ns/op +--- BENCH: BenchmarkNext +bench_traversal_test.go:347: Next=49 +bench_traversal_test.go:347: Next=49 +bench_traversal_test.go:347: Next=49 +bench_traversal_test.go:347: Next=49 +BenchmarkNextFiltered 50000 34887 ns/op +--- BENCH: BenchmarkNextFiltered +bench_traversal_test.go:363: NextFiltered=6 +bench_traversal_test.go:363: NextFiltered=6 +bench_traversal_test.go:363: NextFiltered=6 +bench_traversal_test.go:363: NextFiltered=6 +BenchmarkNextAll 50000 60734 ns/op +--- BENCH: BenchmarkNextAll +bench_traversal_test.go:379: NextAll=234 +bench_traversal_test.go:379: NextAll=234 +bench_traversal_test.go:379: NextAll=234 +bench_traversal_test.go:379: NextAll=234 +BenchmarkNextAllFiltered 50000 67428 ns/op +--- BENCH: BenchmarkNextAllFiltered +bench_traversal_test.go:395: NextAllFiltered=33 +bench_traversal_test.go:395: NextAllFiltered=33 +bench_traversal_test.go:395: NextAllFiltered=33 +bench_traversal_test.go:395: NextAllFiltered=33 +BenchmarkPrev 50000 32399 ns/op +--- BENCH: BenchmarkPrev +bench_traversal_test.go:411: Prev=49 +bench_traversal_test.go:411: Prev=49 +bench_traversal_test.go:411: Prev=49 +bench_traversal_test.go:411: Prev=49 +BenchmarkPrevFiltered 50000 34944 ns/op +--- BENCH: BenchmarkPrevFiltered +bench_traversal_test.go:429: PrevFiltered=7 +bench_traversal_test.go:429: PrevFiltered=7 +bench_traversal_test.go:429: PrevFiltered=7 +bench_traversal_test.go:429: PrevFiltered=7 +BenchmarkPrevAll 100000 29360 ns/op +--- BENCH: BenchmarkPrevAll +bench_traversal_test.go:445: PrevAll=78 +bench_traversal_test.go:445: PrevAll=78 +bench_traversal_test.go:445: PrevAll=78 +bench_traversal_test.go:445: PrevAll=78 +BenchmarkPrevAllFiltered 50000 32291 ns/op +--- BENCH: BenchmarkPrevAllFiltered +bench_traversal_test.go:461: PrevAllFiltered=6 +bench_traversal_test.go:461: PrevAllFiltered=6 +bench_traversal_test.go:461: PrevAllFiltered=6 +bench_traversal_test.go:461: PrevAllFiltered=6 +BenchmarkNextUntil 10000 191890 ns/op +--- BENCH: BenchmarkNextUntil +bench_traversal_test.go:477: NextUntil=84 +bench_traversal_test.go:477: NextUntil=84 +bench_traversal_test.go:477: NextUntil=84 +BenchmarkNextUntilSelection 20000 92054 ns/op +--- BENCH: BenchmarkNextUntilSelection +bench_traversal_test.go:494: NextUntilSelection=42 +bench_traversal_test.go:494: NextUntilSelection=42 +bench_traversal_test.go:494: NextUntilSelection=42 +bench_traversal_test.go:494: NextUntilSelection=42 +BenchmarkNextUntilNodes 50000 43401 ns/op +--- BENCH: BenchmarkNextUntilNodes +bench_traversal_test.go:512: NextUntilNodes=12 +bench_traversal_test.go:512: NextUntilNodes=12 +bench_traversal_test.go:512: NextUntilNodes=12 +bench_traversal_test.go:512: NextUntilNodes=12 +BenchmarkPrevUntil 5000 433383 ns/op +--- BENCH: BenchmarkPrevUntil +bench_traversal_test.go:528: PrevUntil=238 +bench_traversal_test.go:528: PrevUntil=238 +bench_traversal_test.go:528: PrevUntil=238 +BenchmarkPrevUntilSelection 10000 116423 ns/op +--- BENCH: BenchmarkPrevUntilSelection +bench_traversal_test.go:545: PrevUntilSelection=49 +bench_traversal_test.go:545: PrevUntilSelection=49 +bench_traversal_test.go:545: PrevUntilSelection=49 +BenchmarkPrevUntilNodes 50000 35338 ns/op +--- BENCH: BenchmarkPrevUntilNodes +bench_traversal_test.go:563: PrevUntilNodes=11 +bench_traversal_test.go:563: PrevUntilNodes=11 +bench_traversal_test.go:563: PrevUntilNodes=11 +bench_traversal_test.go:563: PrevUntilNodes=11 +BenchmarkNextFilteredUntil 10000 104686 ns/op +--- BENCH: BenchmarkNextFilteredUntil +bench_traversal_test.go:579: NextFilteredUntil=22 +bench_traversal_test.go:579: NextFilteredUntil=22 +bench_traversal_test.go:579: NextFilteredUntil=22 +BenchmarkNextFilteredUntilSelection 20000 99485 ns/op +--- BENCH: BenchmarkNextFilteredUntilSelection +bench_traversal_test.go:596: NextFilteredUntilSelection=22 +bench_traversal_test.go:596: NextFilteredUntilSelection=22 +bench_traversal_test.go:596: NextFilteredUntilSelection=22 +bench_traversal_test.go:596: NextFilteredUntilSelection=22 +BenchmarkNextFilteredUntilNodes 20000 99452 ns/op +--- BENCH: BenchmarkNextFilteredUntilNodes +bench_traversal_test.go:614: NextFilteredUntilNodes=22 +bench_traversal_test.go:614: NextFilteredUntilNodes=22 +bench_traversal_test.go:614: NextFilteredUntilNodes=22 +bench_traversal_test.go:614: NextFilteredUntilNodes=22 +BenchmarkPrevFilteredUntil 10000 112640 ns/op +--- BENCH: BenchmarkPrevFilteredUntil +bench_traversal_test.go:630: PrevFilteredUntil=20 +bench_traversal_test.go:630: PrevFilteredUntil=20 +bench_traversal_test.go:630: PrevFilteredUntil=20 +BenchmarkPrevFilteredUntilSelection 10000 103702 ns/op +--- BENCH: BenchmarkPrevFilteredUntilSelection +bench_traversal_test.go:647: PrevFilteredUntilSelection=20 +bench_traversal_test.go:647: PrevFilteredUntilSelection=20 +bench_traversal_test.go:647: PrevFilteredUntilSelection=20 +BenchmarkPrevFilteredUntilNodes 10000 103277 ns/op +--- BENCH: BenchmarkPrevFilteredUntilNodes +bench_traversal_test.go:665: PrevFilteredUntilNodes=20 +bench_traversal_test.go:665: PrevFilteredUntilNodes=20 +bench_traversal_test.go:665: PrevFilteredUntilNodes=20 +BenchmarkClosest 500000 6530 ns/op +--- BENCH: BenchmarkClosest +bench_traversal_test.go:681: Closest=2 +bench_traversal_test.go:681: Closest=2 +bench_traversal_test.go:681: Closest=2 +bench_traversal_test.go:681: Closest=2 +BenchmarkClosestSelection 1000000 1135 ns/op +--- BENCH: BenchmarkClosestSelection +bench_traversal_test.go:698: ClosestSelection=2 +bench_traversal_test.go:698: ClosestSelection=2 +bench_traversal_test.go:698: ClosestSelection=2 +bench_traversal_test.go:698: ClosestSelection=2 +BenchmarkClosestNodes 1000000 1133 ns/op +--- BENCH: BenchmarkClosestNodes +bench_traversal_test.go:715: ClosestNodes=2 +bench_traversal_test.go:715: ClosestNodes=2 +bench_traversal_test.go:715: ClosestNodes=2 +bench_traversal_test.go:715: ClosestNodes=2 +ok github.com/PuerkitoBio/goquery 192.541s diff --git a/bench_traversal_test.go b/bench_traversal_test.go index c42a6dd..43610f6 100644 --- a/bench_traversal_test.go +++ b/bench_traversal_test.go @@ -664,3 +664,53 @@ func BenchmarkPrevFilteredUntilNodes(b *testing.B) { } b.Logf("PrevFilteredUntilNodes=%d", n) } + +func BenchmarkClosest(b *testing.B) { + var n int + + b.StopTimer() + sel := Doc().Find(".container-fluid") + b.StartTimer() + for i := 0; i < b.N; i++ { + if n == 0 { + n = sel.Closest(".pvk-content").Length() + } else { + sel.Closest(".pvk-content") + } + } + b.Logf("Closest=%d", n) +} + +func BenchmarkClosestSelection(b *testing.B) { + var n int + + b.StopTimer() + sel := Doc().Find(".container-fluid") + sel2 := Doc().Find(".pvk-content") + b.StartTimer() + for i := 0; i < b.N; i++ { + if n == 0 { + n = sel.ClosestSelection(sel2).Length() + } else { + sel.ClosestSelection(sel2) + } + } + b.Logf("ClosestSelection=%d", n) +} + +func BenchmarkClosestNodes(b *testing.B) { + var n int + + b.StopTimer() + sel := Doc().Find(".container-fluid") + nodes := Doc().Find(".pvk-content").Nodes + b.StartTimer() + for i := 0; i < b.N; i++ { + if n == 0 { + n = sel.ClosestNodes(nodes...).Length() + } else { + sel.ClosestNodes(nodes...) + } + } + b.Logf("ClosestNodes=%d", n) +} diff --git a/traversal_test.go b/traversal_test.go index 2fbb29e..5b8249d 100644 --- a/traversal_test.go +++ b/traversal_test.go @@ -609,3 +609,67 @@ func TestClosestRollback(t *testing.T) { sel2 := sel.Closest(".pvk-content").End() AssertEqual(t, sel, sel2) } + +func TestClosestSelectionItself(t *testing.T) { + sel := Doc2().Find(".three") + sel2 := sel.ClosestSelection(Doc2().Find(".row")) + AssertLength(t, sel2.Nodes, sel.Length()) +} + +func TestClosestSelectionNoDupes(t *testing.T) { + sel := Doc().Find(".span12") + sel2 := sel.ClosestSelection(Doc().Find(".pvk-content")) + AssertLength(t, sel2.Nodes, 1) + AssertClass(t, sel2, "pvk-content") +} + +func TestClosestSelectionNone(t *testing.T) { + sel := Doc().Find("h4") + sel2 := sel.ClosestSelection(Doc().Find("a")) + AssertLength(t, sel2.Nodes, 0) +} + +func TestClosestSelectionMany(t *testing.T) { + sel := Doc().Find(".container-fluid") + sel2 := sel.ClosestSelection(Doc().Find(".pvk-content")) + AssertLength(t, sel2.Nodes, 2) + AssertSelectionIs(t, sel2, "#pc1", "#pc2") +} + +func TestClosestSelectionRollback(t *testing.T) { + sel := Doc().Find(".container-fluid") + sel2 := sel.ClosestSelection(Doc().Find(".pvk-content")).End() + AssertEqual(t, sel, sel2) +} + +func TestClosestNodesItself(t *testing.T) { + sel := Doc2().Find(".three") + sel2 := sel.ClosestNodes(Doc2().Find(".row").Nodes...) + AssertLength(t, sel2.Nodes, sel.Length()) +} + +func TestClosestNodesNoDupes(t *testing.T) { + sel := Doc().Find(".span12") + sel2 := sel.ClosestNodes(Doc().Find(".pvk-content").Nodes...) + AssertLength(t, sel2.Nodes, 1) + AssertClass(t, sel2, "pvk-content") +} + +func TestClosestNodesNone(t *testing.T) { + sel := Doc().Find("h4") + sel2 := sel.ClosestNodes(Doc().Find("a").Nodes...) + AssertLength(t, sel2.Nodes, 0) +} + +func TestClosestNodesMany(t *testing.T) { + sel := Doc().Find(".container-fluid") + sel2 := sel.ClosestNodes(Doc().Find(".pvk-content").Nodes...) + AssertLength(t, sel2.Nodes, 2) + AssertSelectionIs(t, sel2, "#pc1", "#pc2") +} + +func TestClosestNodesRollback(t *testing.T) { + sel := Doc().Find(".container-fluid") + sel2 := sel.ClosestNodes(Doc().Find(".pvk-content").Nodes...).End() + AssertEqual(t, sel, sel2) +}