Fastest BF Interpreter

24
hogelog http://hogel.org/ http://twitter.com/hogelog

description

My Fastest BF Interpreter fast-bf

Transcript of Fastest BF Interpreter

Page 1: Fastest BF Interpreter

hogelog

http://hogel.org/

http://twitter.com/hogelog

Page 2: Fastest BF Interpreter

Where is fastest BF interpreter?

Page 4: Fastest BF Interpreter

Demo

Page 6: Fastest BF Interpreter

Existing fastest(?) BF interpreter

$ time ./bff4 <sample/mandelbrot.b

real 0m8.525s

user 0m8.457s

sys 0m0.004s

Page 7: Fastest BF Interpreter

Interpret with JIT

$ time ./bf-jit <sample/mandelbrot.b

real 0m3.906s

user 0m3.860s

sys 0m0.000s

Faster!

Page 8: Fastest BF Interpreter

Interpret with optimizations

$ time ./bf-vm-opt <sample/mandelbrot.b

real 0m3.770s

user 0m3.724s

sys 0m0.000s

Faster!

Page 9: Fastest BF Interpreter

Interpret with JIT, optimizations

$ time ./bf-jit-opt <sample/mandelbrot.b

real 0m1.573s

user 0m1.540s

sys 0m0.000s

Fastest!

Page 10: Fastest BF Interpreter

If any other faster,

It’s bug!

Page 12: Fastest BF Interpreter

Appendix A:

Brainf**k

Design Pattern

Page 13: Fastest BF Interpreter

++++++++++

*ptr += 10

Page 14: Fastest BF Interpreter

>>>>>>>>>>

ptr += 10

Page 15: Fastest BF Interpreter

[-]

*ptr = 0

Page 16: Fastest BF Interpreter

[>+<-]

*(ptr+1) += *ptr

*ptr = 0

Page 17: Fastest BF Interpreter

Appendix B:

Brainf**k

Optimization

Page 18: Fastest BF Interpreter

BF: ++++++++++

Interpret: ++*ptr;++*ptr; …

FetchInstruction

EvalIncrement

FetchInstruction

EvalIncrement

10 Instructions

Page 19: Fastest BF Interpreter

BF: ++++++++++

Interpret: *ptr += 10

FetchInstruction

EvalCalc +10

1 Instruction

Page 20: Fastest BF Interpreter

BF: >>>>>>>>>>

Interpret: ++ptr;++ptr; …

FetchInstruction

EvalNext

FetchInstruction

EvalNext

10 Instructions

Page 21: Fastest BF Interpreter

BF: >>>>>>>>>>

Interpret: ptr += 10

FetchInstruction

EvalMove +10

1 Instruction

Page 22: Fastest BF Interpreter

BF: [-]

Interpret:

if(!*ptr) goto ];--*ptr;goto [;

FetchInstruction

Jump If Zero

FetchInstruction

EvalDecrement

FetchInstruction

Jump

Contains Branch

Page 23: Fastest BF Interpreter

BF: [-]

Interpret: *ptr = 0

FetchInstruction

EvalReset Zero

1 Instruction, No Branch