I wonder if the problem is that when you call sleep;3 with an argument of one second, the processor considers this long enough to switch context and continue with the next threads, which is not the case when the argument is only one ten-thousandth of a second. This is exactly what happens when the amount of time to sleep for is less than the clock resolution.
The sleep functions (meaning both the C library and system functions, on both Linux and FreeBSD) all require an integral argument as their sole calling parameter, so I think what's happening is that the argument is being coerced into a zero, the thread is calling sleep with an argument of zero, and thus the process is sequentially calling sleep two threads at a time, as that is its upper limit on an Intel processor with hyperthreading.
This is a test program to test the "zero" second sleep call.
#include <unistd.h> #include <stddef.h> #include <stdint.h> #include <stdlib.h> #include <stdio.h> int main(void) { sleep(0.001); return EXIT_SUCCESS; }
It looks like that's exactly what would happen. The argument to the sleep function, located in the rdi register, is being set to zero in the second line of main.
main: sub rsp, 8 xor edi, edi call sleep xor eax, eax add rsp, 8 ret
In reply to Re: Perl threads loss of performance with system call
by jflopezfernandez
in thread Perl threads loss of performance with system call
by daniel85
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |