想知道一个进程运行了多长时间以及更多吗?Linux time命令返回时间统计信息,让您对程序所使用的资源有更深入的了解。
有许多Linux发行版和不同的类Unix操作系统。每一个都有一个默认的命令shell。现代Linux发行版中最常见的默认shell是bash shell。但是还有很多其他的,比如zshell(zsh)和Korn shell(ksh)。
所有这些shell都包含自己的时间命令,可以作为内置命令,也可以作为保留字。当您在终端窗口中键入时间时,shell将执行其内部命令,而不是使用作为Linux发行版的一部分提供的GNU time二进制文件。
我们希望使用GNU版本的time,因为它有更多的选项,而且更灵活。
您可以使用type命令检查将运行哪个版本。类型将让您知道shell是自己处理指令,还是将其内部例程传递给GNU二进制文件。
在终端窗口中键入单词类型、空格,然后键入单词时间并按Enter键。
type time我们可以看到bashshell中time是一个保留字。这意味着Bash将默认使用其internaltime例程。
type time在zshell(zsh)中,time是一个保留字,因此默认情况下将使用内部shell例程。
type time在kornshell中,时间是一个关键字。将使用内部例程而不是GNU time命令。
相关:什么是ZSH,为什么要用它来代替Bash?
如果Linux系统上的shell有一个内部时间例程,那么如果您希望使用GNU时间二进制文件,就需要显式的。您必须:
which time命令给出了二进制文件的路径。
我们可以使用/usr/bin/time作为启动GNU二进制文件的命令来测试这一点。这很管用。我们从time命令得到一个响应,告诉我们没有提供任何命令行参数。
输入command time也很有效,我们从time获得相同的用法信息。命令告诉shell忽略下一个命令,以便在shell外部处理它。
在命令名之前使用\字符与在命令名之前使用命令相同。
确保使用GNU时间二进制文件的最简单方法是使用反斜杠选项。
time \timetime调用shell版本的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-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek"; // get length of string once, outside of loops len = strlen( szString ); for (j=0; j<500000; j++) { for (i=0; i < len; i++ ) { if (szString[i] == '-') count++; } } printf("Counted %d hyphens\n", count); exit (0); } // end of main这是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-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek"; for (j=0; j<500000; j++) { // getting length of string every // time the loops trigger for (i=0; i < strlen(szString); i++ ) { if (szString[i] == '-') count++; } } printf("Counted %d hyphens\n", count); exit (0); } // end of main让我们启动loop1程序,用时间来衡量它的性能。
\time ./loop1现在让我们对loop2做同样的操作。
\time ./loop2这给了我们两组结果,但它们的格式非常难看。我们可以稍后做些什么,但是让我们从结果中挑选一些信息。
当程序运行时,有两种执行模式在它们之间来回切换。这些被称为用户模式和内核模式。
简言之,处于用户模式的进程不能在其自身分配之外直接访问硬件或引用内存。为了访问这些资源,进程必须向内核发出请求。如果内核批准了请求,进程将进入内核模式执行,直到满足需求为止。然后将该过程切换回用户模式执行。
loop1的结果告诉我们,loop1在用户模式下花费了0.09秒。它要么在内核模式下花费了零时间,要么在内核模式下的时间太低,一旦四舍五入就无法注册。总运行时间为0.1秒。loop1在其总运行时间内平均获得89%的CPU时间。
低效的loop2程序的执行时间是原来的三倍。它的总运行时间是0.3秒。用户模式下的处理时间为0.29秒。没有注册内核模式。loop2在运行期间平均获得96%的CPU时间。
您可以使用格式字符串自定义时间输出。格式字符串可以包含文本和格式说明符。格式说明符列表可以在手册页上找到。每个格式说明符表示一条信息。
打印字符串时,格式说明符将替换为它们所表示的实际值。例如,CPU百分比的格式说明符是字母P。要向time指示格式说明符不仅仅是一个普通字母,请向其添加一个百分号,如%P。我们来举个例子。
-f(format string)选项用于告诉time后面是一个格式字符串。
我们的格式字符串将打印字符“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\nTotal time: %E\nUser Mode (s) %U\nKernel Mode (s) %S\nCPU: %P" ./loop1要保留所执行测试的计时记录,可以随时将输出发送到文件中。为此,请使用-o(output)选项。程序的输出仍将显示在终端窗口中。只有来自时间的输出被重定向到文件。
我们可以重新运行测试并将输出保存到测试_结果.txt文件如下:
\time -o test_results.txt -f "Program: %C\nTotal time: %E\nUser Mode (s) %U\nKernel Mode (s) %S\nCPU: %P" ./loop1 cat test_results.txtloop1程序输出显示在终端窗口中,并且从时间到测试的结果_结果.txt文件。
如果要在同一文件中捕获下一组结果,必须使用-a(append)选项,如下所示:
\time -o test_results.txt -a -f "Program: %C\nTotal time: %E\nUser Mode (s) %U\nKernel Mode (s) %S\nCPU: %P" ./loop2 cat test_results.txt现在应该很清楚为什么我们使用%C格式说明符在格式字符串的输出中包含程序名。
对于程序员和开发人员来说,time命令可能是微调代码的最常用的方法,对于那些希望在每次启动程序时了解更多幕后情况的人来说,time命令也很有用。
... 不寻常的是,您会被提示同意Microsoft EULA(以下是如何理解EULA)。现在,这是一个令人毛骨悚然的地方:你可能对此有保留。尽管这些TrueType字体(不同于OpenType字体)已经免费提供,但您会注意到它们不是开源的。此外...
... 在您真正充分利用终端之前,您需要知道如何导航它。这就是为什么我们认为这些是最基本的Linux命令:如果你不能更改目录或者在一个你不记得如何使用的命令上获得帮助,那么再多的终端知识也帮不了你。 ...
... 在本文中,我将向您展示如何在Linux上安装、运行和使用PowerShell! ...
...此,这几乎是获取定量数据的唯一方法,说明系统的性能如何——如果您的数字不足,这表明您可能希望升级一些PC组件。 ...
Linux seq命令可以在眨眼之间生成数字列表。但是如何将这个功能付诸实际使用呢?我们将向您展示seq如何为您带来便利。 seq命令 乍一看,Linux seq命令似乎有些奇怪。它可以让你快速生成数字序列,就这样!不过,这里的关键...
...想知道,当我们在浏览器中键入网站名称时,这种神奇是如何发生的。通过dig,你可以探索网络变戏法的过程。
...ee、vmstat和top。我们还将直接查看reading/proc/meminfo。 linux如何使用ram RAM是一种有限的资源,所有进程(如应用程序和守护进程)都需要它的一部分。只有这么多了。内核判断内存争用,并将定量分配的内存分配给所有饥饿的进...