As chamadas do sistema são independentes da linguagem; é fácil escrever uma ferramenta em uma montagem mais lenta do que uma implementação equivalente em uma linguagem de alto nível, se alguém fizer uso ineficiente de chamadas do sistema; Um exemplo altamente planejado, porém simples, para ilustrar esse ponto seria:
$ strace -c perl -e 'print "A"x9999' >/dev/null
...
100.00 0.000026 224 23 total
$ strace -c ./max >/dev/null
...
100.00 0.000430 10000 total
Onde ./max
é o seguinte programa de montagem IA-64 para Linux:
SECTION .text
Message: db "A"
global _start
_start:
mov r9,9999
_again:
mov rax,1 ; sys_write
mov rdi,1 ; stdout
mov rsi,Message
mov rdx,1
syscall
dec r9
jnz _again
_finish:
mov rax,60 ; sys_exit
mov rdi,0 ; exit code
syscall
Como compilado via
$ nasm -f elf64 -o max.o max.asm ; ld -o max max.o
Os programas devem executar a mesma tarefa para que uma comparação direta seja válida.
As chamadas provavelmente aumentam geralmente com a complexidade da ferramenta usada, embora se possa inventar um caso contraditório de uma rede neural fantasticamente complicada que usa apenas sys_read
(para obter entrada) sys_write
(para emitir saída) e então talvez sys_exit
. Eu acho que você poderia analisar o número de chamadas do sistema versus "complexidade" (talvez linhas de código?) E traçar isso para ver se há alguma tendência? (A leitura em "unikernel" pode ser informativa em relação à disputa de complexidade.)
A coluna de erro é quantos erros existem, como mostrado fechando a saída padrão e, em seguida, chamando algo que grava nela e, obviamente, falha:
$ strace -c ./max >&-
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00 0.000427 0 9999 9999 write
0.00 0.000000 0 1 execve
------ ----------- ----------- --------- --------- ----------------
100.00 0.000427 10000 9999 total