如何在linux上使用time命令

想知道一個程序運行了多長時間以及更多嗎?Linux time命令返回時間統計資訊,讓您對程式所使用的資源有更深入的瞭解。...

想知道一個程序運行了多長時間以及更多嗎?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

如何在linux上使用time命令

我們可以看到bashshell中time是一個保留字。這意味著Bash將預設使用其internaltime例程。

type time

如何在linux上使用time命令

在zshell(zsh)中,time是一個保留字,因此預設情況下將使用內部shell例程。

type time

如何在linux上使用time命令

在kornshell中,時間是一個關鍵字。將使用內部例程而不是GNU time命令。

相關:什麼是ZSH,為什麼要用它來代替Bash?

執行gnu time命令

如果Linux系統上的shell有一個內部時間例程,那麼如果您希望使用GNU時間二進位制檔案,就需要顯式的。您必須:

  • 提供二進位制檔案的完整路徑,例如/usr/bin/time。執行which time命令查詢此路徑。
  • 使用命令時間。
  • 使用像\time這樣的反斜槓。

如何在linux上使用time命令

which time命令給出了二進位制檔案的路徑。

我們可以使用/usr/bin/time作為啟動GNU二進位制檔案的命令來測試這一點。這很管用。我們從time命令得到一個響應,告訴我們沒有提供任何命令列引數。

輸入command time也很有效,我們從time獲得相同的用法資訊。命令告訴shell忽略下一個命令,以便在shell外部處理它。

在命令名之前使用\字元與在命令名之前使用命令相同。

確保使用GNU時間二進位制檔案的最簡單方法是使用反斜槓選項。

time \time

如何在linux上使用time命令

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-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

如何在linux上使用time命令

現在讓我們對loop2做同樣的操作。

\time ./loop2

如何在linux上使用time命令

這給了我們兩組結果,但它們的格式非常難看。我們可以稍後做些什麼,但是讓我們從結果中挑選一些資訊。

當程式執行時,有兩種執行模式在它們之間來回切換。這些被稱為使用者模式和核心模式。

簡言之,處於使用者模式的程序不能在其自身分配之外直接訪問硬體或引用記憶體。為了訪問這些資源,程序必須向核心發出請求。如果核心批准了請求,程序將進入核心模式執行,直到滿足需求為止。然後將該過程切換回使用者模式執行。

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

如何在linux上使用time命令

將輸出傳送到檔案

要保留所執行測試的計時記錄,可以隨時將輸出傳送到檔案中。為此,請使用-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.txt

如何在linux上使用time命令

loop1程式輸出顯示在終端視窗中,並且從時間到測試的結果_結果.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

如何在linux上使用time命令

現在應該很清楚為什麼我們使用%C格式說明符在格式字串的輸出中包含程式名。

我們沒時間了

對於程式設計師和開發人員來說,time命令可能是微調程式碼的最常用的方法,對於那些希望在每次啟動程式時瞭解更多幕後情況的人來說,time命令也很有用。

  • 發表於 2021-04-03 12:59
  • 閱讀 ( 39 )
  • 分類:網際網路

你可能感興趣的文章

如何用python程式設計和控制arduino

... 本文將向您展示如何使用Python程式從命令列設定一個Arduino UNO(儘管任何與Arduino相容的板都可以在這裡工作)。本教程是為Windows10編寫的,但也適用於Mac和Linux。你甚至可以使用這個工作...

  • 發佈於 2021-03-11 16:20
  • 閲讀 ( 75 )

如何在ubuntu linux中安裝microsoft文字字型

... 不尋常的是,您會被提示同意Microsoft EULA(以下是如何理解EULA)。現在,這是一個令人毛骨悚然的地方:你可能對此有保留。儘管這些TrueType字型(不同於OpenType字型)已經免費提供,但您會注意到它們不是開源的。此外...

  • 發佈於 2021-03-14 15:30
  • 閲讀 ( 60 )

從命令列關閉linux計算機的5種方法

... 讓我們依次檢視這些命令,並檢查如何以及何時使用這些命令。 ...

  • 發佈於 2021-03-14 17:35
  • 閲讀 ( 46 )

40多個最常用的linux終端命令

... 在您真正充分利用終端之前,您需要知道如何導航它。這就是為什麼我們認為這些是最基本的Linux命令:如果你不能更改目錄或者在一個你不記得如何使用的命令上獲得幫助,那麼再多的終端知識也幫不了你。 ...

  • 發佈於 2021-03-15 21:40
  • 閲讀 ( 49 )

如何在linux上安裝和使用powershell

... 在本文中,我將向您展示如何在Linux上安裝、執行和使用PowerShell! ...

  • 發佈於 2021-03-16 02:34
  • 閲讀 ( 53 )

如何測試linux pc的效能

...此,這幾乎是獲取定量資料的唯一方法,說明系統的效能如何——如果您的數字不足,這表明您可能希望升級一些PC元件。 ...

  • 發佈於 2021-03-17 09:58
  • 閲讀 ( 50 )

什麼是unix時代?unix時代是什麼時候?

... 如何在程式語言中使用unix時間 ...

  • 發佈於 2021-03-26 15:47
  • 閲讀 ( 46 )

linux中的程序是什麼?

... 流程如何開始 ...

  • 發佈於 2021-03-27 02:21
  • 閲讀 ( 60 )

終極樹莓皮命令備忘單

... 這就是為什麼我們準備了這個方便的備忘單的日常使用樹莓皮。 ...

  • 發佈於 2021-03-30 18:59
  • 閲讀 ( 57 )

如何在linux上使用seq命令

Linux seq命令可以在眨眼之間生成數字列表。但是如何將這個功能付諸實際使用呢?我們將向您展示seq如何為您帶來便利。 seq命令 乍一看,Linux seq命令似乎有些奇怪。它可以讓你快速生成數字序列,就這樣!不過,這裡的關鍵...

  • 發佈於 2021-04-01 11:46
  • 閲讀 ( 44 )
白露飲晨霜灬
白露飲晨霜灬

0 篇文章

作家榜

  1. admin 0 文章
  2. 孫小欽 0 文章
  3. JVhby0 0 文章
  4. fvpvzrr 0 文章
  5. 0sus8kksc 0 文章
  6. zsfn1903 0 文章
  7. w91395898 0 文章
  8. SuperQueen123 0 文章

相關推薦