# A01: phonebook
作業解說 video,請對照觀看
$ git clone https://github.com/sysprog21/phonebook/
$ cd phonebook
$ make
[sudo] password for 字樣時,輸入自己的 Linux 使用帳號密碼$ make run
Ctrl-C 可以離開畫面)size of entry : 136 bytes
execution time of append() : 0.043859 sec
execution time of findName() : 0.004776 sec
$ make plot
runtime.png,可用 eog runtime.png 命令來觀看$ gnuplot
> set title 'my plot' @設定圖片名稱
> set xlabel 'x axis' @設定XY軸座標名稱
> set ylabel 'y axis'
> set terminal png @設定輸出格式為 .png
> set output 'output_plot.png' @設定輸出檔名
> plot [1:10][0:1] sin(x) @畫出 sin(x) 函式
@x軸座標範圍 1-10
@y軸座標範圍 0-1
$ astyle --style=kr --indent=spaces=4 --indent-switches --suffix=none *.[ch]
git commit 時,檢查 C/C++ 原始程式碼的風格是否一致:$ ln -sf ../../scripts/pre-commit.hook .git/hooks/pre-commit

在 GitHub 上 fork phonebook,然後適度修改 phonebook_opt.c 和 phonebook_opt.h 兩個檔案,使得這兩者執行時期的 cache miss 降低。請用 perf 驗證,而且改進的過程中,不能有功能方面的減損。
phonebook_orig.[ch] 不需要修改,我們關注的是 phonebook_opt.[ch],當然要修改 main.c 也是允許的
findName() 的時間必須原本的時間更短
append() 的時間可以比原始版本稍久,但不應該增加太多
main.c 應該只有一份,不要建立新的 main(),善用 Makefile 定義對應的 CFLAGS
在執行程式(phonebook_orig 和 phonebook_opt) 前,先清空 cache:
$ echo 1 | sudo tee /proc/sys/vm/drop_caches
除了修改程式,也要編輯「作業區」,增添開發紀錄和 GitHub 連結
務必使用 astyle 來對程式碼進行排版,詳細使用方式見 README.html
本例選用的 dataset (也就是輸入電話簿的姓名) 是否存在問題?
可能的效能改進方向:
struct __PHONE_BOOK_ENTRY 的成員,搬動到新的結構中截止日期:
findName() 的 cache miss 與執行成本,append() 也該想辦法縮減時間
McDonald,但若使用者輸入 MacDonald 或 McDonalds,也一併檢索出來