NOTE: pexists/C is only marginally (5-12%) faster than pexists/PP in this case, but there are other cases where the C implementation is a factor of 2 faster (scroll down)... This test shows the advantage of a straight pexists call to parsing Proc::ProcessTable output. all tests were done 3 times and averaged (test scripts below) pexists/C pexists/PurePerl ptable/cache_ttys ptable/uncached lap: 15830806 13940630 3803 3769 imac: 1137529 1046094 557 552 hub: 2308826 2189815 1517 1512 pexists/C / pexists/PurePerl (module is rebuilt for the two tests) sleep 60 & \ ( sleep .5 ; pid=$! ; time perl -e \ 'my $wpid="'$pid'"; use Proc::Exists qw(pexists); $i=0; while(pexists($wpid)) { ++$i }; print "$i\n" ' ) ptable/cache_ttys sleep 60 & \ ( sleep .5 ; pid=$! ; time perl -e \ 'my $wpid="'$pid'"; use Proc::ProcessTable; $i=0; $p = new Proc::ProcessTable( "cache_ttys" => 1 ); while(grep { $_->pid eq $wpid } @{$p->table}) { ++$i }; print "$i\n" ' ) ptable/uncached sleep 60 & \ ( sleep .5 ; pid=$! ; time perl -e \ 'my $wpid="'$pid'"; use Proc::ProcessTable; $i=0; $p = new Proc::ProcessTable(); while(grep { $_->pid eq $wpid } @{$p->table}) { ++$i }; print "$i\n" ' ) ... and now as promised, tests highlighting the difference between the C and pureperl implementations... 1yes-1no/C 1yes-1no/PurePerl 2yes/C 2yes/PurePerl lap: 13411479 6077823 12475458 5800595 imac: 989762 477005 931743 465103 hub: 1926110 1160990 1803996 1138647 1yes-1no: sleep 60 & \ ( sleep .5 ; pid=$! ; time perl -e \ 'my $wpid="'$pid'"; use Proc::Exists qw(pexists); $i=0; while(pexists($wpid, 99999)) { ++$i }; print "$i\n" ' ) 2yes: #don't check $wpid twice in a row, b/c then you have to back to back #signal latency to the same process to deal with - ie you have to #wait for the other process to eat the signal before you send another #numbers via XS: lap: 12539305, imac: 908734, hub: 1720115 sleep 60 & \ ( sleep .5 ; pid=$! ; time perl -e \ 'my $wpid="'$pid'"; use Proc::Exists qw(pexists); $i=0; while(2==pexists($wpid, 1)) { ++$i }; print "$i\n" ' ) NOTE: the behavior of perl/select is essentially the following: For sleep values down to 1/Hz setting, sleep for approximately the time inicated. For values below that, sleep 1/Hz seconds instead. For values *WAY* below that, don't even give up control! So if you use this to poll if another process is ready (not to be used as a substitute for a proper lock, only as an adjunct/optimization!), don't make the mistake of sleeping for 0 or even 0.0000001 seconds, figuring that will give up control to another process. it won't! this behavior may or may not be different on other unix variants. INTERVAL=0.01; sleep 60 & ( sleep .5 ; pid=$! ; time perl -e \ 'my $wpid="'$pid'"; use Proc::Exists qw(pexists); $i=0; while(pexists($wpid)) { ++$i; select(undef, undef, undef, '$INTERVAL'); } print "$i\n" ' ) interval\iter/cpu%: imac hub lap 1 60/<0.01% 60/<0.01% 60/<0.01% 0.1 599/<0.01% 600/<0.01% 600/<0.01% 0.01 4974/0.01% 5999/0.01% 4995/<0.01% 0.001 14909/0.02% 5998/0.01% 14965/<0.01% 0.0001 14898/0.02% 5998/0.01% 14963/<0.01% 0.00001 14904/0.02% 5999/0.01% 14980/<0.01% 0.000001 14911/0.02% 2023672/100% 14955/<0.01% 0.0000001 881039/100% 2024237/100% 12431092/100% imac = 300MHz G3 PPC, linux 2.6.20, Hz=250 hub = 750MHz P3 x86, linux 2.4.26, Hz=100 lap = 2.3GHz core2 x64_64, linux 2.6.22, Hz=250 TODO: compare a tickless kernel