---
tags: 進階電腦系統理論與實作, NCKU Linux Kernel Internals, 作業系統
---
# [2020q3 Homework3](https://hackmd.io/@sysprog/2020-homework3) (dict)
contributed by <`RusselCK` >
###### tags: `RusselCK`
> [dict](https://hackmd.io/@sysprog/2020-dict#-Trie-%E5%92%8C-Ternary-search-tree)
## 視覺化 [ternary search tree](hhttps://hackmd.io/nnYME5GkRS2JEfY1WD28FA?view#-ternary-search-tree-%E7%9A%84%E5%AF%A6%E4%BD%9C%E7%A8%8B%E5%BC%8F%E7%A2%BC) + bloom filter 的效能表現並分析
* 允許不同的字串輸入並探討 TST 回應的統計分佈
>* 要考慮到 prefix search 的特性還有詞彙的涵蓋率
>* 限用 [gnuplot](https://hackmd.io/@sysprog/Skwp-alOg?type=view) 來製圖
## 以 [perf 分析](https://hackmd.io/nnYME5GkRS2JEfY1WD28FA?view#%E4%BD%BF%E7%94%A8-perf-%E5%88%86%E6%9E%90%E7%A8%8B%E5%BC%8F%E6%95%88%E8%83%BD) TST 程式碼的執行時期行為並且充分解讀
* CPY 機制
```
$ sudo perf stat ./test_common --bench CPY
CPY mechanism
ternary_tree, loaded 206849 words in 0.108725 sec
Performance counter stats for './test_common --bench CPY':
13,760.11 msec task-clock # 0.999 CPUs utilized
67 context-switches # 0.005 K/sec
0 cpu-migrations # 0.000 K/sec
7,352 page-faults # 0.534 K/sec
46,180,340,963 cycles # 3.356 GHz
52,118,242,060 instructions # 1.13 insn per cycle
7,539,335,793 branches # 547.913 M/sec
218,537,018 branch-misses # 2.90% of all branches
13.770924690 seconds time elapsed
13.740414000 seconds user
0.020000000 seconds sys
```
* REF 機制
```
$ sudo perf stat ./test_common --bench REF
REF mechanism
ternary_tree, loaded 206849 words in 0.109187 sec
Performance counter stats for './test_common --bench REF':
19,406.16 msec task-clock # 0.999 CPUs utilized
81 context-switches # 0.004 K/sec
0 cpu-migrations # 0.000 K/sec
7,172 page-faults # 0.370 K/sec
54,332,178,006 cycles # 2.800 GHz
52,101,462,485 instructions # 0.96 insn per cycle
7,535,813,034 branches # 388.321 M/sec
219,356,372 branch-misses # 2.91% of all branches
19.422496812 seconds time elapsed
19.350347000 seconds user
0.055983000 seconds sys
```
## 考慮到 CPY 和 REF 這兩種實作機制,思考效能落差的緣故
* 充分量化並以現代處理器架構的行為解讀
#### 如何兼顧執行時間和空間運用效率?
#### 後續效能改善機制
## 研讀論文並參閱對應程式碼實作 [xor_singleheader](https://github.com/FastFilter/xor_singleheader),引入 dict 程式碼中
* 論文:[Xor Filters: Faster and Smaller Than Bloom and Cuckoo Filters](https://arxiv.org/abs/1912.08258)
#### 比較原有的 bloom filter 和 xor filter 在錯誤率及記憶體開銷
> 善用 Valgrind 和 [Massif](https://valgrind.org/docs/manual/ms-manual.html),使用方式參見 [I01: lab0](https://hackmd.io/@sysprog/2020-lab0)
## 如何縮減頻繁 malloc 帶來的效能衝擊呢?
> 提示: [memory pool](https://en.wikipedia.org/wiki/Memory_pool)
* 儲存字串用的 memory pool 在 REF 版本中已實作,但在 tst_ins_del() 當中頻繁以 calloc() 配置節點空間造成的效能衝擊,應許以改進。
* REF 版本中的 pool 只會一直增添新的資料,並沒有從中移除資料的操作發生,因此可以用更進階的手段來管理
* tst 則會有移除節點的操作,我們無法確定要被刪除的節點他使用的記憶體落在 memory pool 的哪個地方,如何管理 memory pool, 使之不會有記憶體碎片產生,是這個問題的關鍵。
#### 在現有的開放原始碼專案中,找出使用 bloom filter 的專案,並解析其導入的考量