[Paul Davis]
pipe()s here
too. last time i benchmarked on an early 2.4 kernel, pipe
and socketpair gave about the same timing figures, quicker than
msgsnd/rcv. i don't remember the exact numbers but i remember being
positively surprised.
from the whitepapers that IBM did, the linux FIFO appears to be just
about the fastest IPC mechanism outside of a microkernel. i am not
sure if even futexes are actually significantly faster.
do you happen to have a pointer ready to those IBM whitepapers you
mention?
i've dug up the old benchmarking code today. it starts a RT thread
that poll()s n times on a pipe, then pthread_cond_wait()s n times and
finally msgrcv()s n times. the main thread writes the current
gettimeofday() to a global and triggers the wakeup of the respective
waiting mechanism, which compares the current gettimeofday() upon
waking up. here are average numbers for 20 wakeups each:
poll: avg 0.01705 ms
cond: avg 0.01576 ms
msg : avg 0.01045 ms
this is on 2.4.22-ll, an 1.7 GHz athlon XP. the last time (referred to
above in the OP) was on 2.4.5-ll (iirc) and a k6-III-450. so either
they sped up msgsnd/rcv (which i doubt), my memory failed me (highly
probable :) or there are significant differences in the respective
kernel code path and processor flavour pairing (too esoteric to
check).
the conclusion i draw is that if you pthread_cond_wait now, you are
probably better off switching to msgsnd/rcv if it fits into your
scheme and you really want the speed. my personal opinion is that the
ease of use of pipe and poll outweighs the microsecond-order gain
msgsnd/rcv gives. it's still blazingly fast. ymmv of course.
i can upload the benchmarking code if there's interest.
giving you an
fd, both pipe and socketpair can be operated on within a
poll() loop, which is quite handy sometimes. don't know if futexes
will do that?
you can. it was added as an nth-round iteration of their
design. otherwise, it would be just another example of the crappy *nix
design where "waiting" is a different system call depending on what
you're waiting for.
this sure is good news. though even if this weren't the case, i'm
quite comfortable with poll, and i'd rather work with 'crappy *nix
waiting' than ever MsgWaitForMultipleObjectsEx() another time in my
life :)
even if futexes will reach the speed msgsnd/rcv achieves, they'll have
to make them a real breeze to use to make me dump the working FIFO
code i am using now.
tim