如何在Linux上使用time命令

打开终端窗口的Linux PCFatmawati Achmad Zaenuri / Shutterstock.com

想知道一个流程运行多长时间还有更多? Linux time命令返回时间统计信息,让您深入了解程序使用的资源。

时间有很多亲戚

有许多Linux发行版和不同的类Unix操作系统。其中每个都有一个默认的命令shell。现代Linux发行版中最常见的默认shell是bash shell。但是还有很多其他的,比如Z shell(zsh)和Korn shell(ksh)。

所有这些shell都包含自己的time命令,可以是内置命令,也可以是保留字。当您在终端窗口中键入时间时,shell将执行其内部命令,而不是使用作为Linux发行版的一部分提供的GNU时间二进制文件。

我们想要使用GNU版本的时间,因为它有更多选项并且更灵活。

哪个时候会跑?

您可以使用type命令检查将运行的版本。 type将告诉您shell是否将使用其内部例程处理您的指令本身,或将其传递给GNU二进制文件。

在终端窗口中键入单词类型,空格,然后单词时间,然后按Enter键。

输入时间

在bash终端窗口中键入时间

我们可以看到在bash shell中,时间是一个保留字。这意味着Bash默认会使用其内部时间例程。

输入时间

在zsh终端窗口中输入时间

在Z shell(zsh)中,时间是保留字,因此默认情况下将使用内部shell例程。

输入时间

在Korn shell窗口中输入时间

在Korn shell中,time是一个关键字。将使用内部例程而不是GNU time命令。

相关:什么是ZSH,为什么要使用它而不是Bash?

运行GNU time命令

如果您的Linux系统上的shell有一个内部时间例程,那么如果您希望使用GNU时间二进制文件,则需要明确。你必须:

  • 提供二进制文件的完整路径,例如/ usr / bin / time。运行which time命令查找此路径。
  • 使用命令时间。
  • 使用像 time这样的反斜杠。

终端窗口中的时间命令输出

哪个时间命令为我们提供了二进制文件的路径。

我们可以使用/ usr / bin / time作为启动GNU二进制文件的命令来测试它。这样可行。我们从time命令得到一个响应,告诉我们没有提供任何命令行参数供它使用。

键入命令时间也有效,我们从时间获得相同的使用信息。命令命令告诉shell忽略下一个命令,以便在shell外部处理它。

在命令名称前使用字符与在命令名称前使用命令相同。

确保使用GNU时间二进制文件的最简单方法是使用反斜杠选项。

时间

时间

终端窗口中的时间和时间输出

time调用shell版本的时间。 time使用时间二进制。

使用time命令

我们来看看一些节目吧。我们使用了两个名为loop1和loop2的程序。它们是从loop1.c和loop2.c创建的。除了证明一种编码效率低下的影响之外,他们没有做任何有用的事情。

这是loop1.c。两个嵌套循环中需要字符串的长度。在两个嵌套循环之外预先获得长度。

#include“stdio.h”
#include“string.h”
#include“stdlib.h”

int main(int argc,char * argv())
{
 int i,j,len,count = 0;
 char szString()=“how to to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek”;

 //在循环之外获取一次字符串长度
 len = strlen(szString);

 for(j = 0; j <500000; j ++){

 for(i = 0; i

  if(szString(i)==' – ')
    计数++;
   }
 }

 printf(“计数%d连字符 n”,计数);

 退出(0);

} //主要结束

这是loop2.c。对于外环的每个循环,一次又一次地获得字符串的长度。这种低效率应该出现在时间上。

#include“stdio.h”
#include“string.h”
#include“stdlib.h”

int main(int argc,char * argv())
{
 int i,j,count = 0;
 char szString()=“how to to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek”;

 for(j = 0; j <500000; j ++){

 //每次获取字符串的长度
 //循环触发的时间
 for(i = 0; i

   if(szString(i)==' – ')
    计数++;
   }
 }

 printf(“计数%d连字符 n”,计数);

 退出(0);

} //主要结束

让我们启动loop1程序并使用时间来衡量其性能。

time ./loop1

终端窗口中loop1的时间结果

现在让我们为loop2做同样的事情。

time ./loop2

终端窗口中loop2的时间输出

这给了我们两组结果,但它们的格式非常难看。我们稍后可以做些什么,但是让我们从结果中选择一些信息。

当程序运行时,有两种执行模式,它们之间来回切换。这些称为用户模式和内核模式。

简而言之,用户模式下的进程不能直接访问自己分配之外的硬件或引用内存。为了访问这些资源,该进程必须向内核发出请求。如果内核批准了请求,则进程进入内核模式执行,直到满足要求为止。然后,该过程切换回用户模式执行。

loop1的结果告诉我们loop1在用户模式下花了0.09秒。它要么在内核模式下花费零时间,要么内核模式中的时间太低,一旦向下舍入就要注册。总经过时间为0.1秒。 loop1在其总耗用时间内被授予平均89%的CPU时间。

低效的loop2程序执行时间要长三倍。它的总耗时为0.3秒。用户模式下处理时间的持续时间为0.29秒。没有注册内核模式。 loop2在运行期间平均获得96%的CPU时间。

格式化输出

您可以使用格式字符串自定义输出。格式字符串可以包含文本和格式说明符。格式说明符列表可以在手册页上找到时间。每个格式说明符代表一条信息。

打印字符串时,格式说明符将替换为它们表示的实际值。例如,CPU百分比的格式说明符是字母P.要及时指示格式说明符不仅仅是常规字母,请向其添加百分号,例如%P。我们在一个例子中使用它。

-f(格式字符串)选项用于告知时间后面的内容是格式字符串。

我们的格式字符串将打印字符“Program:”和程序名称(以及传递给程序的任何命令行参数)。 %C格式说明符代表“正在计时的命令的名称和命令行参数”。 n使输出移动到下一行。

有许多格式说明符,它们区分大小写,因此请确保在为自己执行此操作时正确输入它们。

接下来,我们将打印字符“Total time:”,然后打印此程序运行所用的总时间值(由%E表示)。

我们使用 n来提供另一个新行。然后我们将打印字符“User Mode(s)”,然后是用户模式中花费的CPU时间值,由%U表示。

我们使用 n来提供另一个新行。这次我们正在准备内核时间值。我们打印字符“Kernel Mode(s)”,然后是内核模式花费的CPU时间的格式说明符,即%S。

最后,我们将打印字符“ nCPU:”,为我们提供一个新行和该数据值的标题。 %P格式说明符将给出定时进程使用的CPU时间的平均百分比。

整个格式字符串用引号括起来。如果我们对值的对齐很挑剔,我们可以包含一些 t字符来在输出中放置选项卡。

time -f“Program:%C n总时间:%E n用户模式%U n内核模式%S nCPU:%P”./loop1

在终端窗口中输出loop1的格式字符串

将输出发送到文件

要记录您进行的测试的时间,您可以将输出从时间发送到文件。为此,请使用-o(输出)选项。程序的输出仍将显示在终端窗口中。它只是从时间输出重定向到文件。

我们可以重新运行测试并将输出保存到test_results.txt文件,如下所示:

time -o test_results.txt -f“Program:%C nTotal time:%E nUser mode(s)%U n内核模式%S nCPU:%P”./loop1

cat test_results.txt

从loop1的格式字符串输出到终端窗口中的文件

loop1程序输出显示在终端窗口中,时间结果转到test_results.txt文件。

如果要在同一文件中捕获下一组结果,则必须使用-a(append)选项,如下所示:

time -o test_results.txt -a -f“Program:%C nTotal time:%E nUser mode(s)%U n内核模式%S nCPU:%P”./loop2

cat test_results.txt

loop2格式字符串的输出附加到终端窗口中的文件

现在应该明白为什么我们使用%C格式说明符在格式字符串的输出中包含程序的名称。

我们没时间了

可能最常用于程序员和开发人员来微调他们的代码,时间命令对于想要发现更多关于每次启动程序时发生的事情的人都很有用。

资讯来源:由0x资讯编译自HOWTOGEEK。版权归作者Dave McKay所有,未经许可,不得转载
提示:投资有风险,入市需谨慎,本资讯不作为投资理财建议。请理性投资,切实提高风险防范意识;如有发现的违法犯罪线索,可积极向有关部门举报反映。
你可能还喜欢