Buduję swój własny ROM dla Androida. Aby go zbudować, muszę biec
mka -j8 bacon
Chciałem jednak zmierzyć czas potrzebny na jego zbudowanie, więc wykorzystałem
/usr/bin/time -f "User\t%U\nSys\t%S\nReal\t%E\nCPU\t%P" mka -j8 bacon
To nie zadziała, bo to mówi
/usr/bin/time: cannot run mka: No such file or directory
Doceniamy wszelką pomoc w obejściu tego problemu! Używam Xubuntu.
Edytować:
Z jakiegoś powodu użycie make zamiast mka działa, jednak lepsze jest użycie mka .
/usr/bin/time -f "User\t%U\nSys\t%S\nReal\t%E\nCPU\t%P" make -j8 bacon
Edycja 2: ze strony cyanogenmod
Wywołanie
$ source build/envsetup.sh
lub$ . build/envsetup.sh
z poziomu powłoki uruchamia skrypt envsetup.sh w katalogu kompilacji. envsetup.sh dodaje wiele funkcji do środowiska kompilacji, z których najważniejsze są wymienione poniżej.
source build/evnsetup.sh
to polecenie, które uruchamiam przed wykonaniem czasu. Jedną z tych funkcji dodanych przez evnsetup.sh jest to mka
, czy można to wywołać z poziomu time
polecenia?
Edycja 3: Wyjście typu 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
}
źródło
source build/evnsetup.sh
w miejscu, w którym chcesz zadzwonićtime mka -j8 bacon
, możesz opublikować wynik poleceniatype mka
?Odpowiedzi:
Problem polega na tym, że
mka
jest to funkcja bash eksportowana przez twój skrypt, a nie plik wykonywalny (w przeciwieństwie domake
), więc/usr/bin/time
nie może go znaleźć, ponieważ szuka pliku wykonywalnego.Istnieją dwa możliwe rozwiązania.
Po pierwsze, zauważ, że istnieje różnica między wbudowaną funkcją bash
time
a plikiem wykonywalnym/usr/bin/time
. Są to różne polecenia, które przyjmują różne parametry i generują różne dane wyjściowe:Wpisz,
help time
aby uzyskać pomoc dotyczącą wbudowanej wersji bashtime
. Wpisz,man time
aby uzyskać pomoc dotyczącą pliku wykonywalnego/usr/bin/time
.Pierwsze rozwiązanie wykorzystuje
time
, podczas gdy drugie rozwiązanie używa/usr/bin/time
.Pierwsze rozwiązanie: za pomocą wbudowanej funkcji bash
time
Wbudowana funkcja
time
bash rozpoznaje zadeklarowane funkcje bash i możesz od razu użyć jej do pomiaru czasu takich funkcji.W twoim przypadku powinno działać następujące polecenie:
To byłby mój preferowany sposób. Jednak może nie wygenerować dokładnie oczekiwanego wyniku. W szczególności nie mierzy ani nie drukuje użycia procesora.
Drugie rozwiązanie: użycie pliku wykonywalnego
/usr/bin/time
/usr/bin/time
O ile wiem, nie możesz bezpośrednio zmierzyć czasu wbudowanej funkcji bash , ale możesz zmierzyć czas/bin/bash
wykonywalnego wykonania tej funkcji bash. Jest to trochę zuchwałe i generuje trochę narzutu, gdy uruchamiasz dodatkową instancjębash
. Ale narzut ten może być nieistotny w obliczu funkcji, której obliczenie zajmuje kilka minut, więc może lepiej odpowiadać Twoim potrzebom.Aby móc uruchomić
/bin/bash
plik wykonywalny na funkcji bash, musimy najpierw wyeksportować tę funkcję.Dlatego w twoim przypadku, aby móc użyć
/usr/bin/time
i wygenerować żądany format wyjściowy, możesz wykonać następujące czynności:źródło
-f
parametr, nie mogłem tego znaleźć. Po drugie, co oznacza / bin / bash? Naprawdę to doceniam!-f
Parametrexport
mówiexport
eksportować funkcję powłoki. Zobaczyćhelp export
.-f
Parametr/usr/bin/time
mówi/usr/bin/time
się spodziewać ciąg formatu, ale zakładam, że to wiesz./bin/bash
Część ostatniego polecenia jest wykonywalny bash, których wykonanie jest rzeczywiście mierzy czas, kiedy ona sama wykonuje eksportowanychmka
funkcji. Wykonujemka
funkcję, ponieważ czyta i wykonujemka -j8 bacon
polecenie ze standardowego wejścia, dlatego używamyecho
i potoku. Przepraszam za późną odpowiedź, po prostu przeczytaj to. :)