Try   HackMD

2016q3 Homework2 (phonebook-concurrent)

contributed by <Quexint>

重構

  • 參考:什麼是Refactoring?
  • 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
  • 一開始看程式碼有點奇怪,於是加了檢查的步驟。然後發現平行化的版本數量有問題,且存的資料也有問題。
  • 並補上沒有 allocstruct detail.

重構

  • 可讀性
    • 重構 main 函式,變數包成結構,將結構指標傳入小函式中。
    • 對於 make verified,加入對於使用者較明顯的提示
  • 一致性
    • ORIG 裡,Linked-list 裡存的是沒有 '\n' 的 lastname。但在 OPT 裡,有被 findname 找過的 lastname 沒有 '\n',沒被找過的 lastname 有 '\n',資料不夠一致。
    • file_align 裡,直接將 '\n' 刪掉。
  • 可靠性
    • 修正 OPTORIG, linked-list 中有多餘的空元素及漏加的元素。
  • 效率

優化 append()

  • 平行化過 append 應該要較快,發現瓶頸在 detailalloc,故採用 worker pool 的方式加速。
  • 效率

重新評測 findname()

  • 做 100 次實驗,每次隨機搜尋 100 組名字。
  • 對於相同的 findname,搜索時間還是不夠近似,應該是因為輸入不夠隨機。

  • words.txt 做隨機排列,搜索時間的差異沒有變。

優化 findname()

  • 由於 Linked-list 的搜尋無法平行化,所以改針對次數平行化。
  • 效率