I'm ok with this.
On Wed, Jun 05, 2013 at 02:12:36PM -0400, Ted Unangst wrote: > On Wed, Jun 05, 2013 at 14:13, Alexandre Ratchov wrote: > > On Tue, Jun 04, 2013 at 11:33:12PM -0400, Ted Unangst wrote: > >> Instead of using a fixed size hash table for procs, use an rb tree. > >> > >> Makes thread/process lookup even more web scale. > >> > > > > any measurement? > > o ye of little faith... > > stock > 54.65 > 57.29 > 54.54 > > rbproc > 47.27 > 47.34 > 47.16 > > Benchmark code is below. Now you may well complain that I cooked the > test to give me the result I want. If you remove the pid colliding > code pertaining to 42, the results are different. > > stock > 37.16 > 37.52 > 37.07 > > rbproc > 47.20 > 46.84 > 46.51 > > Perhaps a more realistic test is called for, like building a kernel. > > stock > 1m24.51s real 4m6.24s user 0m43.34s system > 1m24.12s real 4m7.64s user 0m41.98s system > > rbproc > 1m24.02s real 4m6.90s user 0m43.65s system > 1m23.88s real 4m6.07s user 0m41.73s system > > rbproc wins by a hair, but I am happy to call it a draw. > > Conclusion? You'll never notice the difference. Personally I have a > slight preference for improving worst case behavior. The hash table > isn't *that* large today, but as we increase maxthreads it will get > bigger. I prefer dynamic structures to statically sized structures. > > #include <errno.h> > #include <stdio.h> > #include <stdlib.h> > #include <unistd.h> > > static __inline uint64_t > rdtsc(void) > { > uint32_t hi, lo; > > __asm __volatile("rdtsc" : "=d" (hi), "=a" (lo)); > return (((uint64_t)hi << 32) | (uint64_t) lo); > } > > const int loops = 2560000; > const int maxproc = 50; > > int > main() > { > int pidhash = 511; > int nprocs; > int pids[200]; > int i, p, pid; > uint64_t before, after; > > printf("creating pids\n"); > nprocs = 0; > while (nprocs < maxproc) { > pid = fork(); > switch (pid) { > case 0: > if ((getpid() & pidhash) != 42) > _exit(0); > while (1) > sleep(1); > break; > case -1: > for (p = 0; p < nprocs; p++) > kill(pids[p], 9); > printf("failed after %d %d\n", nprocs, errno); > exit(1); > default: > if ((pid & pidhash) == 42) > pids[nprocs++] = pid; > else > waitpid(pid, NULL, 0); > } > } > printf("benchmarking...\n"); > before = rdtsc(); > for (i = 0; i < loops; i++) > for (p = 0; p < nprocs; p++) > kill(pids[p], 0); > after = rdtsc(); > for (p = 0; p < nprocs; p++) > kill(pids[p], 9); > printf("%.2f\n", (after - before) / 1000000000.0); > } >