- Python高性能編程(第2版)
- (美)米夏·戈雷利克等
- 795字
- 2023-09-06 19:21:28
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交換到磁盤中,導致操作系統需要訪問磁盤。
- 軟件架構設計:大型網站技術架構與業務架構融合之道
- 跟小海龜學Python
- C語言程序設計案例式教程
- 假如C語言是我發明的:講給孩子聽的大師編程課
- Spring MVC+MyBatis開發從入門到項目實踐(超值版)
- Clean Code in C#
- OpenCV Android開發實戰
- MATLAB 2020 GUI程序設計從入門到精通
- Dart:Scalable Application Development
- Mastering ArcGIS Server Development with JavaScript
- 用Go語言自制編譯器
- Learn C Programming
- Netty 4核心原理與手寫RPC框架實戰
- 瘋狂Ajax講義(第3版)
- C++ Primer(中文版)(第5版)