contributed by <ChienChing
>
~
main.c
assert(findName(input, e) && "Did you implement findName() in " IMPL "?");
assert(0 == strcmp(findName(input, e)->lastName, "zyxel"));
assert是用來將檢查某些變數是否正確,若是不正確即跳出程式碼並印出資訊。
想法是將struct變小後,cache能夠容納的資料筆數就會變多,cache missed rate就能夠降低。所以把struct中除了lastName之外的都刪除了,cache missed rate的確是降低了20%左右,但是findName()的時間沒有任何改變… why?
請注意記憶體配置的方式 jserv
…在看了看Makefile後,發現我沒有定義OPT所以結果都沒丟到opt.txt內,導致算出來一模一樣啊 Orz
經過這個笨點終於使得作業得以進行下去,以下是將Struct變小後的圖
想法:建立一個bucket為26的hash table,利用Name的第一個位元的Ascii碼當成hash table的index加入鍊結串列中,搜尋也是使用Name的第一個位元之Ascii碼去該bucket中尋找。
縮小struct後,再加入hash table後的perf資訊
Performance counter stats for './phonebook_orig' (100 runs):
3,419,092 cache-misses # 93.015 % of all cache refs ( +- 0.02% )
3,675,840 cache-references ( +- 0.05% )
261,214,545 instructions # 1.32 insns per cycle ( +- 0.02% )
197,357,309 cycles ( +- 0.15% )
0.075308425 seconds time elapsed ( +- 0.16% )
Performance counter stats for './phonebook_opt' (100 runs):
411,564 cache-misses # 74.904 % of all cache refs ( +- 0.29% )
549,458 cache-references ( +- 0.46% )
187,801,190 instructions # 1.64 insns per cycle ( +- 0.11% )
114,783,279 cycles ( +- 0.23% )
0.044134299 seconds time elapsed ( +- 0.27% )
output.txt
instrut org opt
append() 0.053186 0.042253
findName() 0.005989 0.000025
what?怎麼會append降低了…?
在撰寫hash table進去main.c的時候想要定義bucket的長度,所以使用了
#define BUCKET_SIZE 26
但是不知為何make不過…,以下是error:
error expected ')' before numeric constant
對於一開始的main()中的free struct,這樣寫是對的嗎?
if (pHead->pNext) free(pHead->pNext);
free(pHead);
如此一來不是只free到兩個節點而已嗎?
chienching