contributed by <atlantis0914
>
typedef struct __PHONE_BOOK_ENTRY {
char lastName[MAX_LAST_NAME_SIZE];
char firstName[16];
char email[16];
char phone[10];
char cell[10];
char addr1[16];
char addr2[16];
char city[16];
char state[2];
char zip[5];
struct __PHONE_BOOK_ENTRY *pNext;
} entry;
使用perf量測cache miss
1,354,901 cache-misses # 68.477 % of all cache refs (73.93%)
1,770,259 cache-references (75.52%)
305,758,311 instructions # 1.21 insns per cycle (76.75%)
258,470,718 cycles (75.60%)
0.091748655 seconds time elapsed ( +- 0.74% )
B-Tree(Bayer-McCreight, 1972):
參數為degree,或稱branching factor,表示一個node包含的children數量,B-Tree儲存的資料為key-value的組合,標準的B-Tree結構為(以degree =M為例):
Leaf:
為key-value pair儲存的地方,可以儲存L個key-value pair,每個leaf的高度相同。
Internal node:
為key儲存的地方,每個node最多可以儲存M-1個key,以及M/2至M個children。
Root:
可以儲存2至M個children。
一個標準的B-Tree如下圖:
這次實作的B-Tree是針對phonebook做的修改,如下:
以圖示來表達資料結構:
typedef struct __BTREE_ENTRY {
char lastName[MAX_LAST_NAME_NUM];
struct __BTREE_NODE *pNext;
} bTreeEntry;
typedef struct __BTREE_NODE {
int degree;
struct __BTREE_ENTRY children[DEGREE];
} bTreeNode;
其中DEGREE為一個Node可以儲存的entry個數,相當於branching factor。
以下是B-Tree如何進行append(以DEGREE = 4為例):
此時root的degree已經等於DEGREE的值(DEGREE = 4),root會分裂並且新增root如下:
繼續append…
此時左下角的Node已經滿了,必須分裂
繼續append
右下角的Node滿了,必須分裂
這時候Root滿了,同樣要再分裂
從圖中描述可以得知,B-Tree在append的過程是不斷的往上長。
DEGREE = 64
721,939 cache-misses # 76.656 % of all cache refs (74.79%)
922,121 cache-references (75.07%)
3,193,521,105 instructions # 2.12 insns per cycle (75.39%)
1,503,996,958 cycles (75.03%)
0.514395667 seconds time elapsed ( +- 0.26% )
DEGREE = 128
625,691 cache-misses # 66.105 % of all cache refs (74.92%)
915,545 cache-references (75.03%)
4,722,925,716 instructions # 2.21 insns per cycle (75.16%)
2,096,578,194 cycles (75.04%)
0.747960187 seconds time elapsed ( +- 0.65% )
改進方向: