解讀 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 時間相關的簡要技術細節。