Contenu connexe
Similaire à Brainfuck interpreter 分析新竹碼農0307 (6)
Plus de Xatierlike Lee (8)
Brainfuck interpreter 分析新竹碼農0307
- 2. 實驗目標
● 觀察不同的優化影響
● 逐步改善 brainfuck virtual machine 實作
- 3. git
● 全專案使用 git 管理
● 不同 branch 代表不同優化階段
● Open sourced on github
– https://github.com/xatier/brainfuck-tools
– https://github.com/xatier/brainfuck-bench
- 4. Brainfuck compiler
● The Brainf*ck Compiler Suite (by Clifford Wolf)
– http://www.clifford.at/bfcpu/bfcomp.html
● components
– bfa The assembler
– bfc The compiler
– bfrun Runtime
● compile / assemble / run
– ./bfc < hanoi.bfc > hanoi.bfa
– ./bfa < hanoi.bfa > hanoi.bf
– ./bfrun hanoi.bf
- 7. basic
● 最簡單的 interpreter
● 根據語言定義逐步翻譯、解釋 brainfuck 程式
● Keep it Simple, Stupid (?)
● Mandelbrot test → 3min … Orz
- 8. loop
● 透過分析 brainfuck 程式的 loop
● 改以遞迴方式執行 '[ xxx ]' 這樣的 pattern
● Mandelbrot test → 30 sec
- 9. compact
● +++ 、 ------ 、 <<<<< 、 >>>>
● 重複的操作可以被壓縮
● ++*ptr
– *ptr += ptr->value
● 30sec → 10sec
- 10. ZERO
● [-]
● while (*ptr)
--*ptr;
● 等價於 *ptr = 0;
- 11. Another
● 不只 >>>> 和 ++++ 等 pattern 可以作
compact
● 其實 >>><<<><>>>> 或是 +++----+-+++ 這樣的
冗於 pattern 也可以壓縮
● 於 code-gen 生出來的 brainfuck code 中較
常出現
● bfc
● 效果?
- 12. benchmark
12000
10000
8000
mandelbrot.b
6000 hanoi.bf
time
loops.bf
bench.bf
4000
2000
0
basic loop compact zero master
git branch
- 13. log10(t*10)
6
5
4
mandelbrot.b
hanoi.bf
3 loops.bf
bench.bf
2
1
0
basic loop compact zero master
- 17. 與其他實作相比
14
12
10
8
mandelbrot.b
6
4
2
0
./bf/bf-git/int ./int/bff/bff ./int/vff/vff6 ./jit/jit/jit ./jit/fast-bf/bf-vm-opt ./jit/fast-bf/bf-jit ./jit/fast-bf/bf-jit-opt
- 18. 結論
● 若找出真正拖累效能的瓶頸,其表現改善有機會是
指數等級的變化!
● 對於各種優化,不同測試樣本的特性,可能得到的
效果不盡然都是進步的
– 有機會開了某個優化後反而變得比較慢
● 手寫代碼 VS code-gen 生成代碼
– 手寫代碼優化 ( 可能 ) 效果有限
● 藉由研究優化分析 code-gen 結果,可以改善
compiler 實作,幫助生成更好的 brainfuck 代碼