我正在构建自己的 android rom。为了构建它,我需要运行
mka -j8 bacon
但是,我想测量构建它所需的时间,所以我使用了
/usr/bin/time -f "User\t%U\nSys\t%S\nReal\t%E\nCPU\t%P" mka -j8 bacon
这不会运行,因为它说
/usr/bin/time: cannot run mka: No such file or directory
任何关于如何解决这个问题的帮助,我都非常感谢!我正在运行 xubuntu。
编辑:
出于某种原因,使用 make 而不是 mka 确实有效,但是使用姆卡更好。
/usr/bin/time -f "User\t%U\nSys\t%S\nReal\t%E\nCPU\t%P" make -j8 bacon
编辑2: 来自cyanogenmod 网站
从您的 shell调用
$ source build/envsetup.sh
或$ . build/envsetup.sh
运行构建目录中的 envsetup.sh 脚本。envsetup.sh 为构建环境添加了许多功能,其中最重要的功能列在下面。
source build/evnsetup.sh
是我在执行时间之前运行的命令。evnsetup.sh 添加的功能之一是mka
,是否可以从time
命令内部调用它?
编辑3:输出类型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
}
答案1
问题在于它mka
是您的脚本导出的一个 bash 函数,而不是一个可执行文件(与相反make
),因此/usr/bin/time
找不到它,因为它正在寻找一个可执行文件。
有两种可能的解决方案。
首先,请注意 bash 内置函数time
和可执行文件之间存在差异/usr/bin/time
。它们是不同的命令,它们采用不同的参数并生成不同的输出:
$ time sleep 1
real 0m1.001s
user 0m0.000s
sys 0m0.001s
$ /usr/bin/time sleep 1
0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 664maxresident)k
0inputs+0outputs (0major+215minor)pagefaults 0swaps
键入help time
获取 bash 内置程序的帮助time
。键入man time
获取可执行程序的帮助/usr/bin/time
。
第一个解决方案使用time
,而第二个解决方案使用/usr/bin/time
。
第一个解决方案:使用 bash 内置函数time
bash 内置函数time
可以识别已声明的 bash 函数,您可以立即使用它来测量此类函数的时间。
$ foo() {
sleep 1;
echo "Hello World"
}
$ time foo
Hello World
real 0m1.002s
user 0m0.000s
sys 0m0.001s
对于您来说,以下命令应该有效:
$ time mka -j8 bacon
这是我首选的方式。但是,它可能无法生成您想要的输出。特别是,它不会测量或打印 CPU 使用率。
第二种解决方案:使用可执行文件/usr/bin/time
您无法直接使用 来测量内置 bash 函数的时间/usr/bin/time
(据我所知),但您可以测量/bin/bash
执行该 bash 函数的可执行文件的时间。这有点不合时宜,而且由于您启动了一个额外的 实例,因此会产生一些开销bash
。但是,当面对需要几分钟才能计算的函数时,这种开销可能可以忽略不计,因此它可能仍然更适合您的需求。
为了能够/bin/bash
在 Bash 函数上启动可执行文件,我们必须首先导出该函数。
$ foo() {
sleep 1;
echo "Hello World"
}
$ export -f foo
$ echo foo | /usr/bin/time /bin/bash
Hello World
0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 1476maxresident)k
0inputs+0outputs (0major+707minor)pagefaults 0swaps
因此,在您的情况下,为了能够使用/usr/bin/time
和生成所需的输出格式,您可以按如下方式进行:
$ export -f mka
$ echo 'mka -j8 bacon' | /usr/bin/time -f "User\t%U\nSys\t%S\nReal\t%E\nCPU\t%P" /bin/bash