目 錄
第1章 CPU與編譯器概論
1.1 高速路與人行道 002
1.2 編譯器是如何運作的 003
編譯后的匯編語言程序 004
添加優(yōu)化選項后的結果 007
1.3 CPU是如何運作的 008
指令集架構與微架構 008
如何執(zhí)行指令 009
指令流水線 011
高速緩存 012
深入探討高速緩存 013
緩存塊的替換算法 015
超標量指令執(zhí)行 015
第1章 是不是偏離了主題 017
第2章 執(zhí)行成本
2.1 兩程序的執(zhí)行成本 020
2.2 計·測·謀 020
書中的探討 020
2.3 防止基準測試程序被優(yōu)化 023
防止操作“歸并” 023
防止變量在初始化時被優(yōu)化 024
防止重復單一指令被優(yōu)化 025
本書中的基準測試程序 026
2.4 驗證——哪一步操作導致執(zhí)行速度緩慢 029
2.5 基礎加法與賦值運算 031
單一的賦值操作(寄存器間的傳送) 032
單一的賦值操作(數據相互關聯(lián)的情況) 032
常量賦值 033
變量間的加法運算 033
變量與常量相加 034
2.6 耗時的乘法運算 036
變量間的乘法運算 037
變量與常量相乘 037
2.7 更為耗時的除法運算 040
變量的除法(寄存器間的計算) 040
除數為2、4的除法運算 042
除數不是2的乘方的除法運算 042
無符號整數除法運算 042
除數為2的乘方時除法運算使用低成本移位指令 043
2.8 內存讀取 045
小數組的讀取(小范圍內的內存操作) 045
大數組的讀取(大范圍內的內存操作) 047
與臺式機的CPU進行比較 049
2.9 造成執(zhí)行時間差別的判斷語句 051
無else節(jié)點的if語句 051
帶else節(jié)點的if語句 053
2.10 32/64位環(huán)境中不同的函數調用 053
2.11 實驗總結 055
若想被愛則先愛 055
第3章 尋找性能瓶頸
3.1 使用gprof命令進行分析 058
gprof的使用方法 058
3.2 哪個環(huán)節(jié)在消耗時間 058
獲取庫函數的評測信息 060
耗時的函數 062
顯示庫函數的調用次數 063
3.3 函數的調用關系 063
3.4 進行數據分析的原理 066
3.5 其他性能分析器 067
培養(yǎng)高水平人才的教育系統(tǒng) 068
第4章 達人方法論
4.1 達人的關注點 072
硬件篇 072
編譯器/中間件篇 074
算法篇 075
4.2 【硬件篇】數組和緩存的有效利用 076
矩陣的乘法運算 076
調整數組操作的順序 077
展開循環(huán)的方式 078
矩陣的分塊 079
4.3 【庫函數篇】緩慢函數的迂回戰(zhàn)術 080
strcmp函數為何緩慢 080
優(yōu)化的陷阱 081
4.4 【硬件篇】使用SIMD進行字符串對比 083
4.5 【庫函數篇】對比各種輸入輸出方法 085
行輸入函數的對比 085
輸出方法 089
管道輸入輸出的特殊案例 091
管道輸入輸出與文件輸入輸出 092
4.6 【算法篇】二分法查找與平衡二叉樹 092
海量數據的分類 093
真要做到如此地步? 097
第5章 進一步研究編譯器
5.1 不同級別的優(yōu)化選項 100
GCC的優(yōu)化選項 100
“零優(yōu)化”對調試有效 100
以不出現未定義行為為前提的2級以上優(yōu)化選項 101
5.2 優(yōu)化·寄存器·外部變量 102
5.3 刪除公共子表達式為程序瘦身 104
5.4 指針與復雜運算簡化 105
5.5 將用戶函數進行內聯(lián)展開 106
和別人拉開差距! 108
第6章 給辦公系統(tǒng)的一些啟示
6.1 排序與字符串操作 112
6.2 小數點數的計算與字符串/數字的換算 112
塊數據輸入輸出和字段分割 113
統(tǒng)計帶小數部分的數 113
整數轉換成字符串 115
性能優(yōu)化的效果 116
6.3 半角字符轉換為全角字符 117
判定字符的字節(jié)數 118
ASCII字符與半角片假名字符的判定 119
ASCII字符轉換為全角字符 123
半角字符轉換為全角字符 124
性能優(yōu)化的效果 127
判定字符字節(jié)數的其他方法 127
有關UTF-8 130
6.4 探索具有某種數據特性的數組 132
數據的特性 133
二分法查找與線性查找相結合 135
性能優(yōu)化的效果 138
后記 139