發表於2024-12-14
C++性能優化指南 pdf epub mobi txt 電子書 下載
前言 xvii
第1章 優化概述 1
1.1 優化是軟件開發的一部分 2
1.2 優化是高效的 3
1.3 優化是沒有問題的 3
1.4 這兒一納秒,那兒一納秒 5
1.5 C++代碼優化策略總結 5
1.5.1 用好的編譯器並用好編譯器 6
1.5.2 使用更好的算法 7
1.5.3 使用更好的庫 8
1.5.4 減少內存分配和復製 9
1.5.5 移除計算 9
1.5.6 使用更好的數據結構 9
1.5.7 提高並發性 10
1.5.8 優化內存管理 10
1.6 小結 10
第2章 影響優化的計算機行為 11
2.1 C++所相信的計算機謊言 12
2.2 計算機的真相 12
2.2.1 內存很慢 13
2.2.2 內存訪問並非以字節為單位 13
2.2.3 某些內存訪問會比其他的更慢 14
2.2.4 內存字分為大端和小端 14
2.2.5 內存容量是有限的 15
2.2.6 指令執行緩慢 16
2.2.7 計算機難以作決定 16
2.2.8 程序執行中的多個流 16
2.2.9 調用操作係統的開銷是昂貴的 18
2.3 C++也會說謊 18
2.3.1 並非所有語句的性能開銷都相同 18
2.3.2 語句並非按順序執行 18
2.4 小結 19
第3章 測量性能 20
3.1 優化思想 21
3.1.1 必須測量性能 21
3.1.2 優化器是王牌獵人 21
3.1.3 90/10規則 22
3.1.4 阿姆達爾定律 23
3.2 進行實驗 24
3.2.1 記實驗筆記 26
3.2.2 測量基準性能並設定目標 26
3.2.3 你隻能改善你能夠測量的 28
3.3 分析程序執行 28
3.4 測量長時間運行的代碼 30
3.4.1 一點關於測量時間的知識 30
3.4.2 用計算機測量時間 35
3.4.3 剋服測量障礙 41
3.4.4 創建stopwatch類 44
3.4.5 使用測試套件測量熱點函數 48
3.5 評估代碼開銷來找齣熱點代碼 48
3.5.1 評估獨立的C++語句的開銷 49
3.5.2 評估循環的開銷 49
3.6 其他找齣熱點代碼的方法 51
3.7 小結 51
第4章 優化字符串的使用:案例研究 53
4.1 為什麼字符串很麻煩 53
4.1.1 字符串是動態分配的 54
4.1.2 字符串就是值 54
4.1.3 字符串會進行大量復製 55
4.2 第一次嘗試優化字符串 56
4.2.1 使用復閤賦值操作避免臨時字符串 57
4.2.2 通過預留存儲空間減少內存的重新分配 57
4.2.3 消除對參數字符串的復製 58
4.2.4 使用迭代器消除指針解引 59
4.2.5 消除對返迴的字符串的復製 59
4.2.6 用字符數組代替字符串 60
4.2.7 第一次優化總結 62
4.3 第二次嘗試優化字符串 62
4.3.1 使用更好的算法 62
4.3.2 使用更好的編譯器 64
4.3.3 使用更好的字符串庫 64
4.3.4 使用更好的內存分配器 67
4.4 消除字符串轉換 69
4.4.1 將C字符串轉換為std::string 69
4.4.2 不同字符集間的轉換 70
4.5 小結 70
第5章 優化算法 71
5.1 算法的時間開銷 72
5.1.1 最優情況、平均情況和最差情況的時間開銷 74
5.1.2 攤銷時間開銷 74
5.1.3 其他開銷 75
5.2 優化查找和排序的工具箱 75
5.3 高效查找算法 75
5.3.1 查找算法的時間開銷 75
5.3.2 當n很小時,所有算法的時間開銷都一樣 76
5.4 高效排序算法 77
5.4.1 排序算法的時間開銷 77
5.4.2 替換在最差情況下性能較差的排序算法 77
5.4.3 利用輸入數據集的已知特性 78
5.5 優化模式 78
5.5.1 預計算 79
5.5.2 延遲計算 80
5.5.3 批量處理 80
5.5.4 緩存 80
5.5.5 特化 81
5.5.6 提高處理量 81
5.5.7 提示 81
5.5.8 優化期待路徑 82
5.5.9 散列法 82
5.5.10 雙重檢查 82
5.6 小結 82
第6章 優化動態分配內存的變量 83
6.1 C++變量迴顧 84
6.1.1 變量的存儲期 84
6.1.2 變量的所有權 86
6.1.3 值對象與實體對象 86
6.2 C++動態變量API迴顧 88
6.2.1 使用智能指針實現動態變量所有權的自動化 90
6.2.2 動態變量有運行時開銷 92
6.3 減少動態變量的使用 92
6.3.1 靜態地創建類實例 92
6.3.2 使用靜態數據結構 93
6.3.3 使用std::make_shared 替代new 錶達式 97
6.3.4 不要無謂地共享所有權 97
6.3.5 使用“主指針”擁有動態變量 98
6.4 減少動態變量的重新分配 99
6.4.1 預分配動態變量以防止重新分配 99
6.4.2 在循環外創建動態變量 99
6.5 移除無謂的復製 100
6.5.1 在類定義中禁止不希望發生的復製 101
6.5.2 移除函數調用上的復製 102
6.5.3 移除函數返迴上的復製 103
6.5.4 免復製庫 105
6.5.5 實現寫時復製慣用法 106
6.5.6 切割數據結構 106
6.6 實現移動語義 107
6.6.1 非標準復製語義:痛苦的實現 107
6.6.2 std::swap():“窮人”的移動語義 108
6.6.3 共享所有權的實體 109
6.6.4 移動語義的移動部分 109
6.6.5 更新代碼以使用移動語義 110
6.6.6 移動語義的微妙之處 111
6.7 扁平數據結構 113
6.8 小結 113
第7章 優化熱點語句 115
7.1 從循環中移除代碼 116
7.1.1 緩存循環結束條件值 117
7.1.2 使用更高效的循環語句 117
7.1.3 用遞減替代遞增 118
7.1.4 從循環中移除不變性代碼 118
7.1.5 從循環中移除無謂的函數調用 119
7.1.6 從循環中移除隱含的函數調用 121
7.1.7 從循環中移除昂貴的、緩慢改變的調用 123
7.1.8 將循環放入函數以減少調用開銷 123
7.1.9 不要頻繁地進行操作 124
7.1.10 其他優化技巧 126
7.2 從函數中移除代碼 126
7.2.1 函數調用的開銷 126
7.2.2 簡短地聲明內聯函數 129
7.2.3 在使用之前定義函數 129
7.2.4 移除未使用的多態性 130
7.2.5 放棄不使用的接口 130
7.2.6 用模闆在編譯時選擇實現 133
7.2.7 避免使用PIMPL慣用法 134
7.2.8 移除對DDL的調用 135
7.2.9 使用靜態成員函數取代成員函數 136
7.2.10 將虛析構函數移至基類中 136
7.3 優化錶達式 137
7.3.1 簡化錶達式 137
7.3.2 將常量組閤在一起 138
7.3.3 使用更高效的運算符 139
7.3.4 使用整數計算替代浮點型計算 139
7.3.5 雙精度類型可能會比浮點型更快 140
7.3.6 用閉形式替代迭代計算 141
7.4 優化控製流程慣用法 142
7.4.1 用switch替代if-else if-else 142
7.4.2 用虛函數替代switch 或if 143
7.4.3 使用無開銷的異常處理 144
7.5 小結 145
第8章 使用更好的庫 146
8.1 優化標準庫的使用 146
8.1.1 C++標準庫的哲學 147
8.1.2 使用C++標準庫的注意事項 147
8.2 優化現有庫 149
8.2.1 改動越少越好 149
8.2.2 添加函數,不要改動功能 150
8.3 設計優化庫 150
8.3.1 草率編碼後悔多 150
8.3.2 在庫的設計上,簡約是一種美德 151
8.3.3 不要在庫內分配內存 152
8.3.4 若有疑問,以速度為準 152
8.3.5 函數比框架更容易優化 152
8.3.6 扁平繼承層次關係 153
8.3.7 扁平調用鏈 153
8.3.8 扁平分層設計 153
8.3.9 避免動態查找 154
8.3.10 留意“上帝函數” 155
8.4 小結 156
第9章 優化查找和排序 157
9.1 使用std::map和std::string的鍵值對錶 158
9.2 改善查找性能的工具箱 159
9.2.1 進行一次基準測量 160
9.2.2 識彆齣待優化的活動 160
9.2.3 分解待優化的活動 160
9.2.4 修改或替換算法和數據結構 161
9.2.5 在自定義抽象上應用優化過程 162
9.3 優化std::map的查找 163
9.3.1 以固定長度的字符數組作為std::map的鍵 163
9.3.2 以C風格的字符串組作為鍵使用std::map 164
9.3.3 當鍵就是值的時候,使用map的錶親std::set 166
9.4 使用
9.4.1 以序列容器作為被查找的鍵值對錶 168
9.4.2 std::find():功能如其名,O(n)時間開銷 169
9.4.3 std::binary_search():不返迴值 169
9.4.4 使用std::equal_range()的二分查找 170
9.4.5 使用std::lower_bound()的二分查找 170
9.4.6 自己編寫二分查找法 171
9.4.7 使用strcmp()自己編寫二分查找法 172
9.5 優化鍵值對散列錶中的查找 173
9.5.1 使用std::unordered_map進行散列 173
9.5.2 對固定長度字符數組的鍵進行散列 174
9.5.3 以空字符結尾的字符串為鍵進行散列 175
9.5.4 用自定義的散列錶進行散列 176
9.6 斯特潘諾夫的抽象懲罰 177
9.7 使用C++標準庫優化排序 178
9.8 小結 179
第10章 優化數據結構 181
10.1 理解標準庫容器 181
10.1.1 序列容器 182
10.1.2 關聯容器 182
10.1.3 測試標準庫容器 183
10.2 std::vector與std::string 187
10.2.1 重新分配的性能影響 188
10.2.2 std::vector中的插入與刪除 188
10.2.3 遍曆std::vector 190
10.2.4 對std::vector排序 191
10.2.5 查找std::vector 191
10.3 std::deque 191
10.3.1 std::deque中的插入和刪除 193
10.3.2 遍曆std::deque 194
10.3.3 對std::deque 的排序 194
10.3.4 查找std::deque 194
10.4 std::list 194
10.4.1 std::list中的插入和刪除 196
10.4.2 遍曆std::list中 197
10.4.3 對std::list排序 197
10.4.4 查找std::list 197
10.5 std::forward_list 198
10.5.1 std::forward_list中的插入和刪除 199
10.5.2 遍曆std::forward_list 199
10.5.3 對std::forward_list排序 199
10.5.4 查找std::forward_list 199
10.6 std::map與std::multimap 199
10.6.1 std::map中的插入和刪除 200
10.6.2 遍曆std::map 202
10.6.3 對std::map排序 202
10.6.4 查找std::map 203
10.7 std::set與std::multiset 203
10.8 std::unordered_map與std::unordered_multimap 204
10.8.1 std::unordered_map中的插入與刪除 206
10.8.2 遍曆std::unordered_map 207
10.8.3 查找std::unordered_map 207
10.9 其他數據結構 208
10.10 小結 209
第11章 優化I/O 210
11.1 讀取文件的秘訣 210
11.1.1 創建一個吝嗇的函數簽名 211
11.1.2 縮短調用鏈 213
11.1.3 減少重新分配 213
11.1.4 更大的吞吐量——使用更大的輸入緩衝區 215
11.1.5 更大的吞吐量——一次讀取一行 216
11.1.6 再次縮短函數調用鏈 217
11.1.7 無用的技巧 218
11.2 寫文件 219
11.3 從std::cin讀取和嚮std::cout中寫入 220
11.4 小結 220
第12章 優化並發 221
12.1 復習並發 222
12.1.1 並發概述 222
12.1.2 交叉執行 226
12.1.3 順序一緻性 226
12.1.4 競爭 227
12.1.5 同步 228
12.1.6 原子性 228
12.2 復習C++並發方式 230
12.2.1 綫程 230
12.2.2 promise和future 231
12.2.3 異步任務 233
12.2.4 互斥量 234
12.2.5 鎖 235
12.2.6 條件變量 236
12.2.7 共享變量上的原子操作 238
12.2.8 展望未來的C++並發特性 240
12.3 優化多綫程C++程序 241
12.3.1 用std::async替代std::thread 242
12.3.2 創建與核心數量一樣多的可執行綫程 243
12.3.3 實現任務隊列和綫程池 244
12.3.4 在單獨的綫程中執 C++性能優化指南 下載 mobi epub pdf txt 電子書
此用戶未及時填寫評價內容,係統默認好評!
評分很給力,京東的商品價格公道,而且質量有保證,可以放心消費而且價格實惠
評分書是正版,包裝完好,好好學習學習。
評分買來看看,希望對寫代碼有幫助
評分很好的書籍,對學習大有益處,值得閱讀!
評分買來看看,希望對寫代碼有幫助
評分………………………………
評分很很很好好好
評分提高技能
C++性能優化指南 pdf epub mobi txt 電子書 下載