Estoy construyendo mi propia rom de Android. Para construirlo, necesito ejecutar
mka -j8 bacon
Sin embargo, quería medir el tiempo que tardó en construirlo, así que usé
/usr/bin/time -f "User\t%U\nSys\t%S\nReal\t%E\nCPU\t%P" mka -j8 bacon
Esto no funcionará, porque dice
/usr/bin/time: cannot run mka: No such file or directory
Se agradece cualquier ayuda para solucionar esto. Estoy ejecutando xubuntu.
Editar:
Por alguna razón, usar make en lugar de mka funciona, sin embargo, usar mka es mejor.
/usr/bin/time -f "User\t%U\nSys\t%S\nReal\t%E\nCPU\t%P" make -j8 bacon
Edición 2: del sitio web cyanogenmod
Invocando
$ source build/envsetup.sh
o$ . build/envsetup.sh
desde su shell ejecuta el script envsetup.sh en el directorio de compilación. envsetup.sh agrega muchas funciones al entorno de compilación, las más importantes se enumeran a continuación.
source build/evnsetup.sh
es el comando que ejecuto antes de ejecutar el tiempo. Una de esas funciones agregadas por evnsetup.sh es mka
, ¿es posible llamar a esto desde el time
comando?
Edición 3: Salida de tipo mka
$ type mka
mka is a function
mka ()
{
case `uname -s` in
Darwin)
make -j `sysctl hw.ncpu|cut -d" " -f2` "$@"
;;
*)
schedtool -B -n 1 -e ionice -n 1 make -j$(cat /proc/cpuinfo | grep "^processor" | wc -l) "$@"
;;
esac
}
fuente
source build/evnsetup.sh
, en el punto donde desea llamartime mka -j8 bacon
, ¿puede publicar la salida del comandotype mka
?Respuestas:
El problema es que
mka
es una función bash exportada por su script y no un ejecutable (a diferencia demake
), por lo/usr/bin/time
que no la encuentra, ya que busca un ejecutable.Hay dos posibles soluciones.
Primero, tenga en cuenta que hay una diferencia entre la función incorporada bash
time
y el ejecutable/usr/bin/time
. Estos son comandos diferentes, que toman diferentes parámetros y generan diferentes resultados:Escriba
help time
para obtener ayuda para el bash incorporadotime
. Escribaman time
para obtener ayuda para el ejecutable/usr/bin/time
.La primera solución usa
time
, mientras que la segunda solución usa/usr/bin/time
.Primera solución: usar la función incorporada bash
time
La función incorporada bash
time
es consciente de las funciones bash declaradas, y puede usarla inmediatamente para medir el tiempo de dichas funciones.En su caso, el siguiente comando debería funcionar:
Esta sería mi forma preferida. Sin embargo, es posible que no genere exactamente la salida que desea. En particular, no mide ni imprime el uso de la CPU.
Segunda solución: usar el ejecutable
/usr/bin/time
No puede medir directamente el tiempo de una función bash incorporada utilizando
/usr/bin/time
(hasta donde yo sé), pero lo que puede hacer es medir el tiempo del/bin/bash
ejecutable que ejecuta esa función bash. Esto es un poco hacky, y genera un poco de sobrecarga al iniciar una instancia adicional debash
. Pero esta sobrecarga puede ser insignificante cuando se enfrenta a una función que requiere minutos para calcular, por lo que aún puede satisfacer mejor sus necesidades.Para poder
/bin/bash
ejecutar el ejecutable en una función bash, primero tenemos que exportar la función.Por lo tanto, en su caso, para poder usar
/usr/bin/time
y generar el formato de salida que desee, puede proceder de la siguiente manera:fuente
-f
parámetro, no pude encontrar esto. En segundo lugar, ¿qué significa / bin / bash? ¡Realmente lo aprecio!-f
parámetro aexport
le diceexport
a exportar una función de shell. Verhelp export
. El-f
parámetro to/usr/bin/time
dice/usr/bin/time
que espere una cadena de formato, pero supongo que ya lo sabe. La/bin/bash
parte del último comando es el ejecutable bash, cuyo tiempo de ejecución se mide realmente, cuando ejecuta lamka
función exportada . Ejecuta lamka
función porque lee y ejecuta elmka -j8 bacon
comando a partir de la entrada estándar, por lo que usamosecho
y una tubería. Perdón por la respuesta tardía, solo lea esto. :)