如何在Linux上使用time命令

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

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

时间有很多亲戚

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

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

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

哪个时候会跑?

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

在终端窗口中输入单词 类型,一个空格,然后是这个词 时间 并按Enter键。

输入时间

在bash终端窗口中键入时间

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

输入时间

在zsh终端窗口中输入时间

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

输入时间

在Korn shell窗口中输入时间

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

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

运行GNU time命令

如果Linux系统上的shell有内部shell 时间 例如,如果你想使用GNU,你需要明确 时间 二进制文件。你必须:

  • 提供二进制文件的完整路径,例如 在/ usr / bin / time会。跑过 哪个时间 命令找到此路径。
  • 使用 指挥时间
  • 使用反斜杠 时间

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

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

我们可以通过使用来测试这个 在/ usr / bin / time会 作为启动GNU二进制文件的命令。这样可行。我们收到了回复 时间 命令告诉我们,我们没有为它提供任何命令行参数。

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

用一个 命令名称前的字符与using相同 命令 在命令名称之前。

确保您使用GNU的最简单方法 时间 binary是要使用反斜杠选项。

时间
时间

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

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

使用time命令

我们来看看一些节目吧。我们正在使用两个叫做的程序 LOOP1环2。它们是从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 <len; 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 <strlen(szString); i ++)

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

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

 退出(0);

//主要结束

让我们开火吧 LOOP1 程序和使用 时间 衡量其表现。

time ./loop1

终端窗口中loop1的时间结果

现在让我们做同样的事情 环2

time ./loop2

终端窗口中loop2的时间输出

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

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

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

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

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

格式化输出

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

打印字符串时,格式说明符将替换为它们表示的实际值。例如,CPU百分比的格式说明符是字母 P 。表示 时间 一个格式说明符不只是一个普通的字母,添加一个百分号,就像 %P 。我们在一个例子中使用它。

-F (格式字符串)选项用于告诉 时间 接下来是格式字符串。

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

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

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

我们用 n 给另一条新线。然后我们将打印字符“User Mode(s)”,然后打印在用户模式下花费的CPU时间的值,由 %U

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

最后,我们打印字符“ nCPU:“给我们一个新行和该数据值的标题。该 %P format specifier将给出定时进程使用的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 文件。

如果要在同一文件中捕获下一组结果,则必须使用 -一个 (追加)选项如下:

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 格式说明符,用于在格式字符串的输出中包含程序的名称。

我们没时间了

可能最常用于程序员和开发人员微调他们的代码, 时间 命令对于每次启动程序时想要了解更多内容的人都很有用。

本文机器自动生成,不保证语句完整通顺和表达准确,亦不对内容真实有效性负责,请读者知悉。