2017q1 Homework1 (phonebook)
Reviewed by Stanley
- 優化開始時,一開始放的圖是硬體環境(cache 大小),可以先放一下 cache miss rate 的資訊,比較可以知道問題在哪,及為什麼要這樣開始做。
- 使用 Hash function 可以標註一下使用的 hash function 為何種?實際的程式碼或是數學式子,這樣在後面比較時效能時,可以看得出來是哪一種 hash function 造成有優化的效果
- "再參考過上課連結embedded-summer2015裡的作法…"這邊可以放上連結,讓參考的同學可以直接連到相關討論串; 另外我對這個作法有點小疑問,就是把 其他資訊完全用另外一個 struct儲存,這樣是用什麼樣的方式另外把 last name 所屬的 node 跟其他資訊的 node 連結起來
- 有點好奇最後 Binary search 建立 dictionary 去存的方式的cach-misses rate,再等妳的實驗結果!
- 有看到妳在 github 的code 有include c file,通常不會這樣做,原先版本有
#include IMPL
可以利用Makefile 裡的這段 -DIMPL來達到切換不同 header file,指令可以下$ make phonebook_opt
中文輸入法安裝
1.取得 APT 金鑰
2.去軟體來源 add 新套件
3.安裝 gcin
開發環境
執行原始檔
在執行時必須先建執行檔,此時的 phonebook_orig 就是執行檔
執行時如果執行檔沒在當前目錄下,就會找不到檔案:
必須利用 cd 進入目錄再執行
優化原始檔
想從 miss cache 下手:
想用 struct 來定義新的型態,struct 就像是一種陣列來存放我們所定義類型的資料:
而此時因為我們只需先比較 word.txt 檔中的 lastname,就可以知道有沒有找到,因此把其他多餘資料都拿掉,結果:
cache-misses 54.415 % of all cache refs
cache-misses 94.490 % of all cache refs
重新閱讀作業要求,你還沒回答指定的問題,及早跟上 –jserv
cache-misses 57.129 % of all cache refs
測試在Structure裡只留下Lastname
再參考過上課連結embedded-summer2015裡的作法(以上討論)後,就來做做看:
將沒有使用到的資料放進另一個structure
github(https://github.com/tina0405/phonebook/commit/a52b59650bb02e212ad09bdf958e3450913f03ed)
使用Binary tree去測試
- 建構方法:
想把長度較長或一樣的放置rightchild,長度較短的放置leftchild,如此一來在search時就可以忽略一部分長度不相符的資料。
- 作法
看了以下的資料後我想先做的是將資料先由小到大排序。

先把資料存進dictionary的矩陣裡,只可惜我還是有改到main.c
首先想到的是以前學過的QuickSort
-
資料上寫說:
- 在平均情況下,快速排序法執行時間的成長速率卻只有nlogn!
可見在大多數情況下,快速排序法的效率仍然是相當優秀的。
-
我的想法:
- 因為我並不理解什麼是大多數情況,所以我想說做完這次,等等用
其他像BubbleSort等排序方法,看看時間消耗。
程式碼:
在剛剛把資料存進dictionary矩陣後,就開始將資料排序好,我認為即使排序的確是會再多花時間,但在之後插入或搜尋好幾比資料,將會變快很多。
不小心在指標和二維的dictionary亂掉,今天花了有點多時間。
先將words.txt削減至4筆測試(依短到長):
改成跑word.txt排序所花費的時間,感覺花好多時間。
而且我又多出一個想法,如果依長度排列之外,應該還要依字母排列,這樣不管在找尋或插入才會更有系統。
參考資料Binary tree
Binarytree_1
Binarytree_2
QuickSort_1
QuickSort_2