2016q3 Homework2 (phonebook-concurrent) === contributed by <Quexint> ## 重構 - 參考:[什麼是Refactoring?](http://teddy-chen-tw.blogspot.tw/2014/04/refactoring.html) - context: codebase (既有的系統), 你想做的事情(公式, Algo, ...etc.) - form: 你如何實作(表示式, 變數名稱, ...) - refactoring(重構) - 定義:在不改變軟體的外在行為之下,改善既有軟體的內部設計 - 如何改善:先判斷軟體中所存在的壞味道(smell),然後套用重構來移除這些壞味道。 - Design: 尋找context與form的界線 - Force: 缺陷 - Smell: Form 的問題種類 - Form 包含 long method (smell) 的話,就會有無法 balance 這些 force 1. explanation 2. sharing 3. choosing ## 開發記錄 ### 原始版本 ### 加入驗證步驟 - 將 `verified` 加進 `Makefile` - 一開始看程式碼有點奇怪,於是加了檢查的步驟。然後發現平行化的版本數量有問題,且存的資料也有問題。 - 並補上沒有 `alloc` 的 `struct detail`. ### 重構 - 可讀性 - 重構 `main` 函式,變數包成結構,將結構指標傳入小函式中。 - 對於 `make verified`,加入對於使用者較明顯的提示 - 一致性 - 在 `ORIG` 裡,Linked-list 裡存的是沒有 `'\n'` 的 lastname。但在 `OPT` 裡,有被 `findname` 找過的 lastname 沒有 `'\n'`,沒被找過的 lastname 有 `'\n'`,資料不夠一致。 - 在 `file_align` 裡,直接將 `'\n'` 刪掉。 - 可靠性 - 修正 `OPT` 跟 `ORIG`, linked-list 中有多餘的空元素及漏加的元素。 - 效率 ![](https://d17oy1vhnax1f7.cloudfront.net/items/2D0G28440B2j2k1z2N2v/runtime_v1.png?v=fabdda82) ### 優化 `append()` - 平行化過 `append` 應該要較快,發現瓶頸在 `detail` 的 `alloc`,故採用 `worker pool` 的方式加速。 - 效率 ![](https://d17oy1vhnax1f7.cloudfront.net/items/1u1r1W3Y2U0u352S0M3C/runtime_v2.png?v=fabdda82) ### 重新評測 `findname()` - 做 100 次實驗,每次隨機搜尋 100 組名字。 - 對於相同的 `findname`,搜索時間還是不夠近似,應該是因為輸入不夠隨機。 ![](https://d17oy1vhnax1f7.cloudfront.net/items/2c1d3V3q3r1f3R0J0l36/runtime_v3.png?v=f2de0540) - 對 `words.txt` 做隨機排列,搜索時間的差異沒有變。 ![](https://d17oy1vhnax1f7.cloudfront.net/items/0C1g3i0z3H2o0k3I470j/runtime_v32.png?v=dd83ac17) ### 優化 `findname()` - 由於 Linked-list 的搜尋無法平行化,所以改針對次數平行化。 - 效率 ![](https://d17oy1vhnax1f7.cloudfront.net/items/1g1c3o390z1f2X2b180x/runtime_v4.png?v=8a7164c9)