2016q3 Homework1 (phonebook)
contributed by <f5120125
>
請依照指定格式填寫標題和"contributed by" 課程助教
Reviewed by GreenYo0413
- 使用二元搜尋數來當作資料結構是個不錯的想法,但產生分枝的方法可以再詳述,像是使用strcmp還是自己定義的hash function。
已新增二元搜尋樹和雜湊函數f5120125
開發環境
Ubuntu 14.04 LTS
- CPU: Intel® Core™ i5 CPU 650 @ 3.20GHz × 4
- Mem: 8 GiB
- Cache:
L1d cache: 32 KB
L1i cache: 32 KB
L2 cache: 256 KB
L3 cache: 4096 KB
前置作業
Github
Gnuplot
Perf
參考[1]和[2]的文章所列出幾個常用指令學習perf
列出所有可以觸發perf採樣點的EVENT:
- 採樣點類型
- [Hardware event]
- [Software event]
- [Hardware cache event]
- [Kernel PMU event]
提供指定程序執行的概括情況
察看整體系統負載:
小結
往後可以根據觸發採樣點的EVENT類型, 去得知需要的資訊
- 例如, 若想知道cache miss在整體系統的狀況
案例分析 - Phonebook
目標
►根據提示可以減少Cache miss或提升效能的修改方向:
1. 未優化版本
►原本的結構 (共計 136 bytes)
- 16+16+16+10+10+16+16+16+2+5=123
compiler做alignment後有128-byte
最後加上pointer的size(在64-bit中為8-byte):128+8=136
2. 優化版本 - 使用較小的結構
►新增結構 (只有32 bytes)
►執行時間
3. 優化版本 - 使用二元搜尋
►採用二元搜尋樹的原因
Binary Search Tree |
Average |
Worst |
space |
|
|
search |
|
|
insert |
|
|
delete |
|
|
►如何建立二元搜尋樹
►二元搜尋樹的實作
Tree node
Search function
- 假設str1為欲在樹中搜尋的字串, str2為目前探訪節點的字串
- 利用strcasecmp或者strncasecmp
strcasecmp(const char *str1, const char *str2)
strncasecmp(const char *str1, const char *str2, size_t len)
- 皆是 case insensitive
- 若 str1 和 str2 相同, 回傳值==0
- 若 str1 > str2, 回傳值>0 (往 right child 探訪)
- 若 str1 < str2, 回傳值<0 (往 left child 探訪)
Build tree
♦如何建立balanced tree structure
- 當root為資料集中間數, 樹的結構能夠較balanced, 所以以n筆sorted list來看, 我們將中間數放在root, 高度預期為
♦從sorted list中的何處開始建立subtree到完成整棵binary search tree
Algorithm
►分析演算法
step 1
- 遞迴建立左節點, 且因sorted list從第一筆開始, 其資料為最小, 要將其放入正確位置則必須深入binary tree的高度, 因此長度會在每次遞迴時除以2,直到碰到NULL
step 2
step 3
- 因為已經處理完目前的資料, 要將指標移向sorted list的下一筆資料
step 4
Time Complexity
- 由於每個節點探訪一次並馬上allocate空間並放入資料, 其時間複雜度為
►執行時間
4. 優化版本 - 使用雜湊函數
- 如何實作hash table
- 定義TABLE_SIZE
- 實作hash_function去取得key值
- 實作hash_append建立hash table
- 實作hash_find_name去找尋給定的last name
- HashTable
-
hash_append
我將新增的item插入slut前端, 每個slut有自己的linked-list. 由於file是由小排序到大讀取, 因此linked-list會是由大到小
-
估計append的時間和建立linked-list差不多
-
由於每個slut有自己的linked-list. 若資料分佈均勻, findName時間可以下降
-
執行時間
5. runtime的比較圖
