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);
}