內容提要
Scala 是一種表達能力非常強的語言,能夠用非常簡潔的代碼表達豐富的業務含義。為了在生產上充分發揮Scala 的能力,除了掌握其簡潔的語法外,理解Scala 在性能上的特點和最佳化點也是非常重要的事。
《高性能Scala》通過解析一個金融領域高頻交易的實際例子,引領讀者掌握如何對Scala 程式(以及一般JVM 程式)進行基準測試和性能分析,從而找出瓶頸。隨後作者介紹了Scala 語言、Scala 標準庫(尤其是集合庫)以及Scalaz 庫里解決相應瓶頸的各種技巧。並行計算和分散式架構作為性能調優的重要手段,更是《高性能Scala》的重中之重,作者對Scala 的並行計算和分散式架構中存在的問題都進行了充分的討論和講解,非常值得學習。
《高性能Scala》適合已經具有Scala 編程基礎、能夠較好地使用Scala 風格代碼實現業務功能的程式設計師,作為在性能最佳化方面的深造閱讀資料。
目錄
前言iX
1 高性能之路 1
-性能的定義2
- - 高性能軟體2
- - 硬體資源 3
- - 時延和吞吐率 4
- - 瓶頸5
-性能總結 5
- - 平均數的問題 6
- - 百分位數來救場 8
-指標蒐集 9
- - 用基準數據(benchmark)來衡量性能. 9
- - 通過Profiling 來定位瓶頸 10
- - 結合基準測試和profiling 10
-案例分析 11
-工具鏈11
-小結 12
2 在JVM 上度量性能13
-金融領域一瞥13
-意外的市場波動毀掉了利潤16
-重現故障 17
- - 吞吐量基準測試 17
- - 時延基準測試20
- - 定位瓶頸 25
- - 微基準取得大進步 42
-小結 49
3 釋放Scala 的性能 51
-值類 52
- - 位元組碼錶示 52
- - 性能考慮 54
- - 標記類型——值類的一種替代品 55
-專門化57
位元組碼錶示 58
性能考慮 60
-元組 65
- - 位元組碼錶示 65
- - 性能考慮 66
-模式匹配 68
- - 位元組碼錶示 68
- - 性能考慮 70
-尾遞歸75
- - 位元組碼錶示 78
- - 性能考慮 79
-Option 數據類型 83
- - 位元組碼錶示 83
- - 性能考慮 84
-案例研究——性能更高的Option 85
-小結 89
4 探索集合API 91
-高吞吐量系統 - 改進指令簿 91
- - 理解過去實現上的折中 - list 實現 92
- - 當前的指令簿 - queue 實現 101
- - 通過惰性計算來提升取消操作的性能104
-歷史數據分析 114
- - 滯後時序收益率(lagged time series returns) 114
- - 處理多個收益率序列 122
-小結 127
5 惰性集合及事件溯源 129
-提升用戶報表生成速度129
- - 深入報表生成代碼 130
- - 使用視圖提速報表生成133
- - 視圖的注意事項141
- - 打包報表生成結果 145
-重新思考報表架構 146
- - Stream 概覽 149
- - 事件變換152
- - 構建事件源管道158
- - 馬爾可夫流式鏈162
- - 流的注意事項 166
-小結 169
6 Scala 的並發 171
-並行回測(backtesting)策略 171
- - 探索Future 173
- - Future 和crazy ideas 177
- - Future 使用時的考量 179
- - 提交執行妨礙性能 185
-處理阻塞調用和回調 188
- - ExecutionContext 和阻塞調用 189
- - 用Promise 轉化回調 193
-受命進一步提升回測性能 196
- - 介紹Scalaz Task 197
- - 用Task 為交易日模擬建模 204
- - 總結回測209
-小結 210
7 高性能架構 211
-分散式自動化交易員(Distributed automated traders) 211
- - 分散式架構概述212
- - 第一次嘗試分散式自動化交易系統 212
- - 引入CRDT 214
- - CRDT 和自動化交易系統219
- - 當餘額不足時 220
-免費交易策略性能提升222
- - 為交易策略做基準測試222
- - 無界佇列(unbounded queue)的危險225
- - 套用背壓(back pressure)226
- - 套用負載控制策略 227
- - Free monad 233
-小結 240