(no title)
adren123 | 3 years ago
$ strace -c ./empty
strace: exec: Erreur de format pour exec()
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
0,00 0,000000 0 1 1 execve
------ ----------- ----------- --------- --------- ----------------
100,00 0,000000 0 1 1 total
$ strace -c /bin/true
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
54,05 0,000060 15 4 mprotect
24,32 0,000027 27 1 set_tid_address
10,81 0,000012 12 1 set_robust_list
8,11 0,000009 9 1 munmap
2,70 0,000003 3 1 prlimit64
0,00 0,000000 0 1 read
0,00 0,000000 0 2 close
0,00 0,000000 0 8 mmap
0,00 0,000000 0 1 brk
0,00 0,000000 0 4 pread64
0,00 0,000000 0 1 1 access
0,00 0,000000 0 1 execve
0,00 0,000000 0 2 1 arch_prctl
0,00 0,000000 0 2 openat
0,00 0,000000 0 2 newfstatat
------ ----------- ----------- --------- --------- ----------------
100,00 0,000111 3 32 2 total
the multiple execution seems to be much slower with the empty executable than with /bin/true using the multitime tool https://tratt.net/laurie/src/multitime/ $ multitime -n 10 ./empty
===> multitime results
1: ./empty
Mean Std.Dev. Min Median Max
real 0.006 0.000 0.005 0.006 0.006
user 0.001 0.001 0.000 0.002 0.002
sys 0.000 0.001 0.000 0.000 0.002
$ multitime -n 10 /bin/true
===> multitime results
1: /bin/true
Mean Std.Dev. Min Median Max
real 0.002 0.000 0.001 0.002 0.003
user 0.001 0.000 0.001 0.001 0.001
sys 0.000 0.000 0.000 0.000 0.000
faho|3 years ago
That's because it reports an error and does not actually execute the file.
>strace: exec: Erreur de format pour exec()
`strace` uses one of the exec()-style functions that don't automatically invoke a shell here. And if it did, it would invoke an entire shell (/bin/sh, typically), which might have more overhead.
----
You need to be very careful when measuring this, because what happens is that a shell executes the shebangless empty file.
If you try launching it from e.g. a C program using execlp(), it will have to first start that shell.
If you try launching it from e.g. bash, it might directly run that in-process or at least after a fork() or similar, skipping some of the shell setup.
So the overhead might depend on context.