in reply to Perl threads loss of performance with system call

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
Most decidedly not a Perl guru

Replies are listed 'Best First'.
Re^2: Perl threads loss of performance with system call
by choroba (Cardinal) on Jul 10, 2021 at 18:29 UTC
    All the shells I have installed (bash, dash, tcsh) support floating point arguments to sleep and they really try to sleep for the specified non-integer time. (See for example lib/sh/ufuncs.c in bash).

    map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]
Re^2: Perl threads loss of performance with system call
by daniel85 (Novice) on Jul 10, 2021 at 19:11 UTC
    Thanks for your reply! The "sleep" was just an example. You can observe the same behaviour with any other command that gets quickly executed (for example, "echo A" will mimic the same behaviour).