deckarep / golang-set

A simple, battle-tested and generic set type for the Go language. Trusted by Docker, 1Password, Ethereum and Hashicorp.
Other
4k stars 272 forks source link

feat: add ContainsOne method #134

Closed vladvalkov closed 6 months ago

vladvalkov commented 6 months ago

This PR solves issue #118 by adding ContainsOne method, which does not cause additional allocations. Also added some benchmarks to compare performance in different cases.

deckarep commented 6 months ago

@vladvalkov - hey thanks for this! I forgot that this method was talked about as an improvement to mitigate allocations. Thanks for the holiday present!

LGTM =)

deckarep commented 6 months ago

Nice win, thanks for the thorough benchmarking!

BenchmarkContainsComparison1Unsafe/Contains-12          61960590            19.25 ns/op        8 B/op          1 allocs/op
BenchmarkContainsComparison1Unsafe/Contains_slice-12    160231255            7.539 ns/op           0 B/op          0 allocs/op
BenchmarkContainsComparison1Unsafe/ContainsOne-12       221081941            5.431 ns/op           0 B/op          0 allocs/op
BenchmarkContainsComparison1Safe/Contains-12            38062934            31.10 ns/op        8 B/op          1 allocs/op
BenchmarkContainsComparison1Safe/Contains_slice-12      59746304            20.06 ns/op        0 B/op          0 allocs/op
BenchmarkContainsComparison1Safe/ContainsOne-12         72793695            16.53 ns/op        0 B/op          0 allocs/op
BenchmarkContainsComparison10Unsafe/Contains-12          5283321           219.6 ns/op        80 B/op         10 allocs/op
BenchmarkContainsComparison10Unsafe/Contains_slice-12   11263368           106.4 ns/op         0 B/op          0 allocs/op
BenchmarkContainsComparison10Unsafe/ContainsOne-12      14033839            85.38 ns/op        0 B/op          0 allocs/op
BenchmarkContainsComparison10Safe/Contains-12            3539056           334.7 ns/op        80 B/op         10 allocs/op
BenchmarkContainsComparison10Safe/Contains_slice-12      5102409           235.1 ns/op         0 B/op          0 allocs/op
BenchmarkContainsComparison10Safe/ContainsOne-12         6373026           188.0 ns/op         0 B/op          0 allocs/op
BenchmarkContainsComparison100Unsafe/Contains-12          405156          2643 ns/op         800 B/op        100 allocs/op
BenchmarkContainsComparison100Unsafe/Contains_slice-12    934239          1125 ns/op           0 B/op          0 allocs/op
BenchmarkContainsComparison100Unsafe/ContainsOne-12      1321592           908.6 ns/op         0 B/op          0 allocs/op
BenchmarkContainsComparison100Safe/Contains-12            329816          3508 ns/op         800 B/op        100 allocs/op
BenchmarkContainsComparison100Safe/Contains_slice-12      492885          2419 ns/op           0 B/op          0 allocs/op
BenchmarkContainsComparison100Safe/ContainsOne-12         618212          1949 ns/op           0 B/op          0 allocs/op