Deseamos enseñarte la mejor información que descubrimos en todo internet. Nuestro deseo es que te sea de mucha utilidad y si deseas aportar alguna mejora siéntete libre de hacerlo..
Solución:
Podría escribir un bucle y recopilar la salida de time
comando y canalizarlo a awk
para calcular el promedio:
avg_time() awk '
/real/ real = real + $2; nr++
/user/ user = user + $2; nu++
/sys/ sys = sys + $2; ns++
END
if (nr>0) printf("real %fn", real/nr);
if (nu>0) printf("user %fn", user/nu);
if (ns>0) printf("sys %fn", sys/ns)
'
Ejemplo:
avg_time 5 sleep 1
te daría
real 1.000000
user 0.000000
sys 0.000000
Esto se puede mejorar fácilmente para:
- dormir durante un tiempo determinado entre ejecuciones
- dormir por un tiempo aleatorio (dentro de un cierto rango) entre ejecuciones
El significado de time -p
desde man time
:
-p When in the POSIX locale, use the precise traditional format "real %fnuser %fnsys %fn" (with numbers in seconds) where the number of decimals in the output for %f is unspecified but is sufficient to express the clock tick accuracy, and at least one.
Es posible que también desee consultar esta herramienta de evaluación comparativa de línea de comandos:
tiburóndp/hiperfino
Tiempo total de ejecución frente a la suma del tiempo de ejecución único
¡Cuidado! dividiendo la suma de N redondeada Tiempo de ejecución es impreciso!
En cambio, podríamos dividir el tiempo total de ejecución de la iteración N (por N)
avg_time_alt() return;
read foo real; read foo user; read foo sys ; < <(
time -p for((;n--;)) "[email protected]" &>/dev/null ; ; 2>&1
)
printf "real: %.5fnuser: %.5fnsys : %.5fn" $(
bc -l <<<"$real/$n;$user/$n;$sys/$n;" )
No un: Esto usa bc
en vez de awk
para calcular el promedio. Para ello, crearíamos un temporal bc
expediente:
printf >/tmp/test-pi.bc "scale=%d;npi=4*a(1);nquitn" 60
Esto calcularía ¶
con 60 decimales, luego sal tranquilamente. (Puede adaptar el número de decimales para su host).
Manifestación:
avg_time_alt 1000 sleep .001
real: 0.00195
user: 0.00008
sys : 0.00016
avg_time_alt 1000 bc -ql /tmp/test-pi.bc
real: 0.00172
user: 0.00120
sys : 0.00058
Donde responderá la función de Codeforester:
avg_time 1000 sleep .001
real 0.000000
user 0.000000
sys 0.000000
avg_time 1000 bc -ql /tmp/test-pi.bc
real 0.000000
user 0.000000
sys 0.000000
Alternativa, inspirada en la respuesta de choroba, usando linux/proc
Bien, podrías considerar:
avgByProc()
local foo start end n=$1 e=$1 values times
shift;
export n;
read foo;
read foo;
read foo foo start foo
< /proc/timer_list;
mapfile values < <(
for((;n--;)) "[email protected]" &>/dev/null;
read -a endstat < /proc/self/stat
read foo
read foo
read foo foo end foo
Esto se basa en /proc
:
man 5 proc | grep [su]time\|timer.list | sed 's/^/> /' (14) utime %lu (15) stime %lu (16) cutime %ld (17) cstime %ld /proc/timer_list (since Linux 2.6.21)
Entonces ahora:
avgByProc 1000 sleep .001
real : 0.00242
utime : 0.00015
stime : 0.00021
cutime : 0.00082
cstime : 0.00020
Donde utime
y stime
representar tiempo de usuario y hora del sistema por golpearse a sí mismo y cutime
y cstime
representar tiempo de usuario infantil y hora del sistema hijocuales son los mas interesantes.
No un: En este caso (sleep
) El comando no usará muchos recursos.
avgByProc 1000 bc -ql /tmp/test-pi.bc
real : 0.00175
utime : 0.00015
stime : 0.00025
cutime : 0.00108
cstime : 0.00032
Esto se vuelve más claro... Por supuesto, al acceder timer_list
y self/stat
sucesivamente pero no atómicamentediferencias entre real
(basado en nanosegundos) y c?[su]time
(basado en garrapatas es decir: 1/100 de segundo) puede aparecer!
Comentarios y puntuaciones
Más adelante puedes encontrar las ilustraciones de otros programadores, tú todavía puedes dejar el tuyo si lo crees conveniente.