我正在運行 ubuntu 的系統上作業。我正在從 /sys/class/thermal 中提供的熱區讀取 CPU 頻率和溫度等基本資料。
不幸的是,我有大約 100 個 thermo_zones 我需要從中讀取資料。我這樣做:
for SENSOR_NODE in /sys/class/thermal/thermal_zone*; do printf "%s: %s\n" $(cat ${SENSOR_NODE}/type) $(cat ${SENSOR_NODE}/temp); done
收集所有資料需要約 2.5-3 秒。這太長了。由于我想每秒收集資料,我的問題是,是否有辦法更快地“讀取”或“收集”資料?
先感謝您
uj5u.com熱心網友回復:
在 shell 中撰寫代碼時您能做的只有這么多,但讓我們從基礎開始。
- 命令替換,
$(...),是昂貴的:它們需要創建一個 FIFO,創建fork()一個新的子行程,將 FIFO 連接到該子行程的標準輸出,從 FIFO 讀取并等待在該子 shell 中運行的命令退出。 - 外部命令,如
cat,很昂貴:它們需要鏈接和加載單獨的可執行檔案;并且當您不運行它們時exec(在這種情況下,它們會繼承并使用 shell 的行程 ID),它們還需要fork()關閉一個新行程。
所有 POSIX 兼容的 shell 都會給你一個read命令:
for sensor_node in /sys/class/thermal/thermal_zone*; do
read -r sensor_type <"$sensor_node/type" || continue
read -r sensor_temp <"$sensor_node/temp" || continue
printf '%s: %s\n' "$sensor_type" "$sensor_temp"
done
...這可以讓您避免命令替換開銷和cat. 但是,read一次只讀取一個位元組;因此,盡管您不支付該開銷,但它仍然相對較慢。
如果你從 切換/bin/sh到bash,你會得到一個更快的選擇:
for sensor_node in /sys/class/thermal/thermal_zone*; do
printf '%s: %s\n' "$(<"$sensor_node/type)" "$(<"$sensor_node/temp")"
done
...因為$(<file)不需要每次讀取一個位元組read。不過,這只是bash更快;這并不意味著它實際上很快。現代生產監控系統通常使用Go或 Node.js 等 JavaScript 運行時撰寫是有原因的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/492662.html
