This is a follow up to:
https://golang.org/cl/12876047/
time: lower level interface to Timer: embedding, compact interface callback with fast
callback
Timers can be heavily used in networking applications.
Current implementation at least has problems with scalability:
$ ./time.test -test.run=none -test.bench=StartStop -test.benchtime=1s
-test.cpu=1,2,4,8,16,32
PASS
BenchmarkStartStop 10000000 214 ns/op
BenchmarkStartStop-2 5000000 515 ns/op
BenchmarkStartStop-4 5000000 735 ns/op
BenchmarkStartStop-8 2000000 804 ns/op
BenchmarkStartStop-16 5000000 708 ns/op
BenchmarkStartStop-32 5000000 679 ns/op
Some spot optimizations can be applied as well. Probably more efficient data structure
can be used, but it's not clear to me how to do better than current 4-ary heap.
FTR here is BenchmarkStartStop profile with 8 procs:
+ 13.75% time.test [kernel.kallsyms] [k] _raw_spin_lock_irqsave
▒
+ 11.25% time.test time.test [.] runtime.lock
◆
+ 11.15% time.test time.test [.] runtime.xchg
▒
+ 6.89% time.test time.test [.] runtime.procyield
▒
+ 6.32% time.test [kernel.kallsyms] [k] _raw_spin_lock
▒
+ 4.06% time.test time.test [.] runtime.cas
▒
+ 3.49% time.test [kernel.kallsyms] [k] gup_pte_range
▒
+ 1.87% time.test time.test [.] runtime.deltimer
▒
+ 1.80% time.test [kernel.kallsyms] [k] get_futex_key
▒
+ 1.71% time.test [kernel.kallsyms] [k] put_page
▒
+ 1.58% time.test [kernel.kallsyms] [k] try_to_wake_up
▒
+ 1.55% time.test [kernel.kallsyms] [k] __wait_on_bit_lock
▒
+ 1.42% time.test time.test [.] flushptrbuf
▒
+ 1.38% time.test [kernel.kallsyms] [k] get_user_pages_fast
▒
+ 1.38% time.test time.test [.] siftup
▒
+ 1.22% time.test [kernel.kallsyms] [k] copy_user_generic_string
▒
+ 1.19% time.test time.test [.] runtime.casp
▒
+ 1.10% time.test [kernel.kallsyms] [k] unlock_page
▒
+ 1.04% time.test [kernel.kallsyms] [k] get_futex_key_refs
▒
+ 1.01% time.test time.test [.] addtimer
▒
+ 1.00% time.test [kernel.kallsyms] [k] drop_futex_key_refs
▒
+ 0.98% time.test [kernel.kallsyms] [k] prepare_to_wait_exclusive
▒
+ 0.97% time.test [kernel.kallsyms] [k] __wake_up_bit
▒
+ 0.94% time.test [kernel.kallsyms] [k] __wake_up_common
▒
+ 0.81% time.test [kernel.kallsyms] [k] audit_filter_syscall
▒
+ 0.75% time.test [kernel.kallsyms] [k] __schedule
▒
+ 0.72% time.test time.test [.] runtime.mallocgc
▒
+ 0.72% time.test time.test [.] siftdown