1 基礎知識
性能優化對象:瓶頸 bottleneck / Hot spot(需要很長時間執行的代碼段)
優化過程
2 Performance Principles (法則)
2.1 80/20定律 (Pareto Principle)
80%的CPU時間花在20%的代碼上
Amdahl定律 -
- 用於查找對系統整體性能提聲最大的部分優化。
- 用於算並行計算的最大加速比
部分優化E使一個運行時間爲P的部分加速S倍,其他部分速度不變
整體加速比 = 優化前的時間 / 優化後的時間 = 1 / ((1-P)+ P/S)
3 Performance Measurement 性能評估 / 測試(對時間)
3.1 計時級制 Timing mechanism
(1)Time時間
時間用於:測量事件序列;量化事件的持續時間和間隔
Why 在計算機系統中需要時間?
- 硬件、操作系統都需要時間和計時器。
- 衡量程序性能,如執行時間
計算機系統裏的兩種時間
- Wall time:運行特定程序所需的總時間。(包含空閒等與用於進程無關的時間)
- CPU時間
User CPU time + System CPU time = CPU time
時間片 time slice
時鐘單元,在某狀態的最小停留時間
(2)Timer 計時器
硬件/軟件都有,用於測量時間
硬件中(如 Intel Architecture, 32/X86, 8253)
- RTC(Real Time CMOS Clock,實時時鐘/外部晶振實時時鐘)
- CMOS RAM:存儲時間、配置
- 低功率電池
- 用於啓動過程
- 後臺一直刷新
- 物理原理:晶體震盪產生時鐘頻率
== 主頻 main frequency / 時鐘頻率 Clock frequency:每秒週期數的倒數==
- PIT (Programmable Interval Timer 可編程間隔定 時器)
計數器生成輸出信號,可能會觸發中斷 - PIC (Programmable Interrupt Controller,中斷控制器)
- TSC (Time Stamp Counter 時間戳計數器)
- TSC從RTC收到CLK signal
- 是64位寄存器,計算週期數(使用longlong)
- 使用RDTSC訪問寄存器的值(納秒級訪問)
- Windows中的接口,QueryPerformanceFrequency / QueryPerformanceCounter訪問(微秒級訪問)參數是一個64位整型的地址
OS中(如 Windows, GetTickCount() | Linux, jiffies )
- DWORD GetTickCount(void); //自上次啓動系統以來經過的毫秒數,每 49.7 天循環一次
從 RTC 讀取,然後轉換 - 系統時間:參數是SYSTEMTIME類型的地址
GetLocalTime() //當地時間
GetSystemTime() //格林威治時間 - 生存期:參數是LARGE_INTERGER(64bits)的地址,用成員QuadPart訪問值
GetSystemTimeAsFileTime()
Win - 1601.1.1 | Linux – 1970.1.1
C/C++(如C的<time.h>)
==Macro宏 CLOCKS_PER_SEC = 1000 ==
- clock()返回的單位是ms,需要除以CLOCK_PER_SECOND得到s
- localtime / gmtime: 參數是time_t,返回值是struct tm類型指針,轉換爲本地時間,或格林威治時間
用asctime函數將其返回值轉換成字符串輸出 - time_t, clock_t都是long
- struct tm
Statistical sampling (抽樣統計) / Profiling (分析)
對採樣過程使用概率定律測量程序狀態。
計時器定期中斷程序,並且記錄程序計數器
- 估計程序在程序中花費的時間
- 檢查程序是否將大部分時間花費在幾個位置
優點:節約時間、成本很低
缺點:可能不能檢查到所有風險
4 Profiler (評測器)
軟件探查器 Software profiler
一種程序,用於對一個或多個過程代碼的執行進行基準測試,以幫助用戶瞭解在代碼執行方面花費的時間。
GNU Gprof – Linux
Vtune - Intel
Visual C++ profiler
Valgrind for different platforms
Profiler用於:
幫助程序員識別
• 計劃的哪些部分是瓶頸導致緩慢。• 代碼的哪些部分被調用的頻率高。
MFLOPS: million floating point operations巨型浮點操作
性能可能用:每秒的MFLOPS數衡量