Saltar al contenido

Calcule el tiempo promedio de ejecución de un programa usando Bash

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *