解讀 R 中 system.time 函式的輸出

Jesse John 2023年1月30日 2022年5月18日
  1. 理解 R 中 system.time 函式輸出中的術語
  2. R 中的 system.time 輸出示例
解讀 R 中 system.time 函式的輸出

system.time() 函式是我們可以用來估計程式碼執行所需時間的工具之一。它的輸出給出了三個值:使用者、系統和經過的時間(以秒為單位)。

在對所涉及的術語進行簡要說明後,我們將檢視此函式的輸出示例,以瞭解每個值所測量的內容。

理解 R 中 system.time 函式輸出中的術語

system.time() 函式的輸出中,最容易理解的術語是第三個值:elapsed。它測量程式碼塊執行時經過的時鐘時間。

在幾乎所有情況下,這對使用者都很重要:他們必須等待 R 完成執行程式碼。

另外兩個,使用者和系統的組合,測量 CPU 執行程式碼塊的時間。

簡單來說,我們可以將它們視為如下。

使用者時間是處理使用者應用程式程式碼(R 程式碼)所花費的 CPU 時間。如果使用者應用程式訪問系統資源,則該處理時間將報告為系統時間。

參考資料部分中給出的 Wikipedia 文章提供了有關 CPU 時間的這兩個組成部分的簡要技術細節。

R 中的 system.time 輸出示例

下面的簡單示例顯示瞭如何使用 system.time() 函式。

示例程式碼:

system.time({
    print("Hello to R.")
})

輸出:

[1] "Hello to R."
   user  system elapsed
  0.001   0.000   0.001

system.time() 函式在程式碼塊之前和之後呼叫 proc.time() 函式,並給出了區別。

它等同於以下內容。

示例程式碼:

x = proc.time()
print("Hello to R.")
y = proc.time()
y-x

輸出:

> x = proc.time()
> print("Hello to R.")
[1] "Hello to R."
> y = proc.time()
> y-x
   user  system elapsed
  0.001   0.001   0.001

看下面兩個例子來了解使用者時間和系統時間的區別。

在第一個示例中,R 計算了 1000 次並且只列印了一次。多次執行此程式碼塊並檢查結果。

示例程式碼:

system.time({
    x=0
    for(i in 1:1000){
        x = x+1
    }
    print(x)
})

輸出:

   user  system elapsed
  0.009   0.000   0.011

雖然使用者時間是正數,但系統時間在大多數情況下幾乎為 0。

現在,讓我們看另一個執行相同計算但列印 1000 次的程式碼示例。

示例程式碼:

system.time({
    x=1
    for(i in 1:1000){
        x = x+1
        print(x)
    }
})

輸出:

   user  system elapsed
  0.093   0.026   0.120

現在,我們發現系統時間也是正數。這是因為 1000 個 print 語句使 R 可以訪問作業系統的輸入輸出資源。

最後,為了說明經過的時間,讓我們看一個 CPU 長時間空閒的例子。

示例程式碼:

system.time({
    Sys.sleep(5) # Time in seconds.
})

輸出:

   user  system elapsed
  0.013   0.006   5.000

我們發現經過的時間遠遠超過 CPU 時間。它(幾乎)與我們指定的睡眠時間相同,因為程式碼沒有做任何其他事情。

參考

以下兩篇 Wikipedia 文章提供了與 CPU 時間相關的簡要技術細節。

  1. CPU 時間
  2. 使用者空間和核心空間
Author: Jesse John
Jesse John avatar Jesse John avatar

Jesse is passionate about data analysis and visualization. He uses the R statistical programming language for all aspects of his work.