官术网_书友最值得收藏!

2.5 使用UNIX命令time的簡單計時

我們暫時離開Python,在類UNIX系統上使用一個標準的系統工具。下面的命令呈現有關程序執行時間的各種視圖,但不關心程序的內部結構:

$ /usr/bin/time -p python julia1_nopil.py
Length of x: 1000
Total elements: 1000000
calculate_z_serial_purepython took 8.279886722564697 seconds
real 8.84
user 8.73
sys 0.10

注意,這里指定的是/usr/bin/time而不是time,因此執行的是系統命令time,而不是shell內置的版本,后者更簡單,用處也沒那么大。如果執行命令time --verbose出錯,很可能是因為你指定的是shell內置命令time,而不是系統命令time。

通過使用標志-p,得到了3個結果。

real指的是總耗時。

user指的是目標任務占用的CPU時間,但不包括內核函數占用的時間。

sys指的是內核函數占用的CPU時間。

通過將user和sys值相加,可大致知道占用的CPU時間。這個相加結果與real的差值可能是I/O等待時間,也可能表明系統忙于執行其他任務,因此扭曲了測量結果。

time很有用,但它并不是專門為Python設計的,其測量結果包括啟動Python解釋器的時間。如果你啟動了大量新進程,而不是只有一個運行時間較長的進程,那么啟動Python解釋器的時間可能占比很高。如果要剖析的是運行時間很短的腳本,那么啟動時間將占據整體運行時間的很大一部分,在這種情況下,time得到的結果將更有用。

要獲得更詳細的輸出,可添加標志--verbose:

$ /usr/bin/time --verbose python julia1_nopil.py
Length of x: 1000
Total elements: 1000000
calculate_z_serial_purepython took 8.477287530899048 seconds
 Command being timed: "python julia1_nopil.py"
 User time (seconds): 8.97
 System time (seconds): 0.05
 Percent of CPU this job got: 99?
 Elapsed (wall clock) time (h:mm:ss or m:ss): 0:09.03
 Average shared text size (kbytes): 0
 Average unshared data size (kbytes): 0
 Average stack size (kbytes): 0
 Average total size (kbytes): 0
 Maximum resident set size (kbytes): 98620
 Average resident set size (kbytes): 0
 Major (requiring I/O) page faults: 0
 Minor (reclaiming a frame) page faults: 26645
 Voluntary context switches: 1
 Involuntary context switches: 27
 Swaps: 0
 File system inputs: 0
 File system outputs: 0
 Socket messages sent: 0
 Socket messages received: 0
 Signals delivered: 0
 Page size (bytes): 4096
 Exit status: 0

在上述輸出中,最有用的指標可能是Major(requiring I/O)page faults,它表明由于在RAM中沒有找到所需的數據,操作系統必須從磁盤加載數據頁。這對速度影響極大。

我們的示例涉及的代碼和數據很少,不會出現缺頁(page fault)問題。如果測試目標是內存密集型進程,或者是多個使用大量RAM的程序,Major(requiring I/O)page faults就可能提供線索,讓你知道哪個程序因為如下情況而降低了速度:它的某些部分已經從RAM交換到磁盤中,導致操作系統需要訪問磁盤。

主站蜘蛛池模板: 乌海市| 南陵县| 张家港市| 达拉特旗| 漠河县| 平凉市| 如皋市| 毕节市| 定襄县| 厦门市| 南乐县| 邵阳市| 安庆市| 怀远县| 德昌县| 玉环县| 新营市| 淮安市| 嘉鱼县| 景宁| 盱眙县| 江达县| 山东省| 雷州市| 瑞安市| 于田县| 文登市| 宿州市| 锡林郭勒盟| 瑞金市| 德庆县| 陵川县| 南丰县| 翁牛特旗| 延庆县| 方城县| 迭部县| 永福县| 仁化县| 南涧| 峡江县|