You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tailscale/util
David Anderson 0909e90890 util/lru: replace container/list with a custom ring implementation
pre-generics container/list is quite unpleasant to use, and the pointer
manipulation operations for an LRU are simple enough to implement directly
now that we have generic types.

With this change, the LRU uses a ring (aka circularly linked list) rather
than a simple doubly-linked list as its internals, because the ring makes
list manipulation edge cases more regular: the only remaining edge case is
the transition between 0 and 1 elements, rather than also having to deal
specially with manipulating the first and last members of the list.

While the primary purpose was improved readability of the code, as it
turns out removing the indirection through an interface box also speeds
up the LRU:

       │ before.txt  │              after.txt              │
       │   sec/op    │   sec/op     vs base                │
LRU-32   67.05n ± 2%   59.73n ± 2%  -10.90% (p=0.000 n=20)

       │ before.txt │             after.txt              │
       │    B/op    │    B/op     vs base                │
LRU-32   21.00 ± 0%   10.00 ± 0%  -52.38% (p=0.000 n=20)

       │ before.txt │           after.txt            │
       │ allocs/op  │ allocs/op   vs base            │
LRU-32   0.000 ± 0%   0.000 ± 0%  ~ (p=1.000 n=20) ¹

Updates #cleanup

Signed-off-by: David Anderson <danderson@tailscale.com>
1 year ago
..
cibuild all: update copyright and license headers 2 years ago
clientmetric util/clientmetric: allow client metric values to be provided by a function 2 years ago
cloudenv all: update copyright and license headers 2 years ago
cmpver util/cmpver: add a few tests covering different OS versions 1 year ago
cmpx all: update exp/slices and fix call sites 1 year ago
codegen util/codegen: support embedded fields 2 years ago
cstruct all: update copyright and license headers 2 years ago
deephash util/deephash: add IncludeFields, ExcludeFields HasherForType Options 1 year ago
dirwalk all: use tstest.Replace more 2 years ago
dnsname cmd/tailscale: extend hostname validation (#7678) 2 years ago
goroutines util/goroutines: let ScrubbedGoroutineDump get only current stack 1 year ago
groupmember all: update copyright and license headers 2 years ago
hashx all: update copyright and license headers 2 years ago
httpm all: update copyright and license headers 2 years ago
jsonutil all: update copyright and license headers 2 years ago
limiter util/limiter: add a keyed token bucket rate limiter 1 year ago
lineread all: update copyright and license headers 2 years ago
linuxfw client/web, clientupdate, util/linuxfw, wgengine/magicsock: Use %v verb for errors 1 year ago
lru util/lru: replace container/list with a custom ring implementation 1 year ago
mak various: add golangci-lint, fix issues (#7905) 2 years ago
multierr all: use Go 1.21 slices, maps instead of x/exp/{slices,maps} 1 year ago
must all: update copyright and license headers 2 years ago
osdiag util/osdiag: add query for Windows page file configuration and status 1 year ago
osshare all: update copyright and license headers 2 years ago
pidowner all: update copyright and license headers 2 years ago
precompress all: update copyright and license headers 2 years ago
quarantine all: update copyright and license headers 2 years ago
racebuild all: update copyright and license headers 2 years ago
rands util/rands: add package with HexString func 1 year ago
ringbuffer util/ringbuffer: move generic ringbuffer from corp repo 2 years ago
set cmd/k8s-operator: add metrics to track usage 1 year ago
singleflight all: update copyright and license headers 2 years ago
slicesx all: use Go 1.21 slices, maps instead of x/exp/{slices,maps} 1 year ago
sysresources util/sysresources, magicsock: scale DERP buffer based on system memory 2 years ago
systemd all: update copyright and license headers 2 years ago
testenv util/testenv: add new package to hold InTest 1 year ago
truncate util: add truncate package (#7490) 2 years ago
uniq all: update copyright and license headers 2 years ago
vizerror util/vizerror: add As function to get wrapped Error 2 years ago
winutil util/winutil: add RegisterForRestart, allowing programs to indicate their preferences to the Windows restart manager 1 year ago