Posted to tcl by hypnotoad at Mon Feb 19 19:12:42 GMT 2018view pretty
basra:quadcode seandeelywoods$ tclsh demos/perftest/tester.tcl -just fib -quadcode-log widen restrict <- fib quadcode-log <- widen CONFIGURE: -quadcode-log widen ==================TIME (ORIGINAL)=================== eval fib 85: "259695496911122585" time fib 85: 8.859180279617366 microseconds per iteration ======================COMPILING===================== get-command-list: 52 microseconds WARNING:varframe.tcl:2972:callframe.store.array:make.array should trigger traces WARNING:varframe.tcl:783:tcl.callframe.load of array should trigger traces init-module: 915577 microseconds register: 10597 microseconds widen: Procedure: ::fib(STRING) bb 0: 0: entry {} {literal {n a b i c}} 1: param {var n 4} {arg 0} 2: jump {bb 1} bb 1: 0: @debug-line {} {literal 45} 1: @debug-script {} {literal {expr {int($n)}}} 2: {instanceOf 252 NUMERIC} {temp 2 6} {var n 4} 3: jumpTrue {bb 3} {temp 2 6} 4: jump {bb 2} bb 2: 0: initException {temp 57 31} {literal {can't use non-numeric value as operand of "::tcl::mathfunc::int"}} {literal {-errorcode {ARITH DOMAIN {non-numeric string}}}} {literal 1} {literal 0} 1: returnCode {temp 51 0} {temp 57 31} 2: procLeave {temp 52 0} {temp 51 0} {literal fib} 3: return {} Nothing {temp 52 0} bb 3: 0: {narrowToType 252 NUMERIC} {var n 11} {var n 4} 1: invoke {temp 57 33} Nothing {literal ::tcl::mathfunc::int} {var n 11} 2: @debug-script {} {literal {set n [expr {int($n)}]}} 3: copy {var n 16} {temp 57 33} 4: @debug-line {} {literal 46} 5: @debug-script {} {literal {if {$n < 1} { return 0 }}} 6: lt {temp 53 0} {var n 16} {literal 1} 7: jumpFalse {bb 5} {temp 53 0} 8: jump {bb 4} bb 4: 0: @debug-line {} {literal 47} 1: @debug-script {} {literal {return 0}} 2: return {} Nothing {literal 0} bb 5: 0: @debug-line {} {literal 46} 1: @debug-script {} {literal {if {$n < 1} { return 0 }}} 2: @debug-line {} {literal 49} 3: @debug-script {} {literal {set a 0}} 4: @debug-line {} {literal 50} 5: @debug-script {} {literal {set b 1}} 6: @debug-line {} {literal 51} 7: @debug-script {} {literal {for {set i 1} {$i < $n} {incr i} { set c [expr {$a + $b}] set a $b set b $c }}} 8: @debug-script {} {literal {set i 1}} 9: @debug-script {} {literal {for {set i 1} {$i < $n} {incr i} { set c [expr {$a + $b}] set a $b set b $c }}} 10: jump {bb 6} bb 6: 0: phi {var a 8} {bb 5} {literal 0} {bb 8} {var a 3} 1: phi {var b 14} {bb 5} {literal 1} {bb 8} {var b 3} 2: phi {var i 9} {bb 5} {literal 1} {bb 8} {var i 4} 3: lt {temp 54 11} {var i 9} {var n 16} 4: jumpTrue {bb 8} {temp 54 11} 5: jump {bb 7} bb 7: 0: @debug-line {} {literal 56} 1: @debug-script {} {literal {return $b}} 2: return {} Nothing {var b 14} bb 8: 0: @debug-line {} {literal 52} 1: @debug-script {} {literal {set c [expr {$a + $b}]}} 2: @debug-script {} {literal {expr {$a + $b}}} 3: add {temp 54 1} {var a 8} {var b 14} 4: @debug-script {} {literal {set c [expr {$a + $b}]}} 5: copy {var c 7} {temp 54 1} 6: @debug-line {} {literal 53} 7: @debug-script {} {literal {set a $b}} 8: copy {var a 3} {var b 14} 9: @debug-line {} {literal 54} 10: @debug-script {} {literal {set b $c}} 11: copy {var b 3} {var c 7} 12: @debug-line {} {literal 51} 13: @debug-script {} {literal {for {set i 1} {$i < $n} {incr i} { set c [expr {$a + $b}] set a $b set b $c }}} 14: @debug-script {} {literal {incr i}} 15: add {var i 4} {var i 9} {literal 1} 16: @debug-script {} {literal {for {set i 1} {$i < $n} {incr i} { set c [expr {$a + $b}] set a $b set b $c }}} 17: jump {bb 6} ----------------------------------------------------------------------------- after widen: Procedure: ::fib(STRING) bb 0: 0: entry {} {literal {n a b i c}} 1: param {var n 4} {arg 0} 2: jump {bb 1} bb 1: 0: @debug-line {} {literal 45} 1: @debug-script {} {literal {expr {int($n)}}} 2: {instanceOf 252 NUMERIC} {temp 2 6} {var n 4} 3: jumpTrue {bb 3} {temp 2 6} 4: jump {bb 2} bb 2: 0: initException {temp 57 31} {literal {can't use non-numeric value as operand of "::tcl::mathfunc::int"}} {literal {-errorcode {ARITH DOMAIN {non-numeric string}}}} {literal 1} {literal 0} 1: returnCode {temp 51 0} {temp 57 31} 2: procLeave {temp 52 0} {temp 51 0} {literal fib} 3: {widenTo 536870972 {FAIL INT}} {temp 0 28} {temp 52 0} 4: return {} Nothing {temp 0 28} bb 3: 0: {narrowToType 252 NUMERIC} {var n 11} {var n 4} 1: invoke {temp 57 33} Nothing {literal ::tcl::mathfunc::int} {var n 11} 2: @debug-script {} {literal {set n [expr {int($n)}]}} 3: copy {var n 16} {temp 57 33} 4: @debug-line {} {literal 46} 5: @debug-script {} {literal {if {$n < 1} { return 0 }}} 6: lt {temp 53 0} {var n 16} {literal 1} 7: jumpFalse {bb 5} {temp 53 0} 8: jump {bb 4} bb 4: 0: @debug-line {} {literal 47} 1: @debug-script {} {literal {return 0}} 2: {widenTo 536870972 {FAIL INT}} {temp 0 29} {literal 0} 3: return {} Nothing {temp 0 29} bb 5: 0: @debug-line {} {literal 46} 1: @debug-script {} {literal {if {$n < 1} { return 0 }}} 2: @debug-line {} {literal 49} 3: @debug-script {} {literal {set a 0}} 4: @debug-line {} {literal 50} 5: @debug-script {} {literal {set b 1}} 6: @debug-line {} {literal 51} 7: @debug-script {} {literal {for {set i 1} {$i < $n} {incr i} { set c [expr {$a + $b}] set a $b set b $c }}} 8: @debug-script {} {literal {set i 1}} 9: @debug-script {} {literal {for {set i 1} {$i < $n} {incr i} { set c [expr {$a + $b}] set a $b set b $c }}} 10: {widenTo 60 INT} {var a 20} {literal 0} 11: {widenTo 60 INT} {var b 32} {literal 1} 12: {widenTo 60 INT} {var i 26} {literal 1} 13: jump {bb 6} bb 6: 0: phi {var a 8} {bb 5} {var a 20} {bb 8} {var a 3} 1: phi {var b 14} {bb 5} {var b 32} {bb 8} {var b 3} 2: phi {var i 9} {bb 5} {var i 26} {bb 8} {var i 4} 3: lt {temp 54 11} {var i 9} {var n 16} 4: jumpTrue {bb 8} {temp 54 11} 5: jump {bb 7} bb 7: 0: @debug-line {} {literal 56} 1: @debug-script {} {literal {return $b}} 2: {widenTo 536870972 {FAIL INT}} {temp 0 30} {var b 14} 3: return {} Nothing {temp 0 30} bb 8: 0: @debug-line {} {literal 52} 1: @debug-script {} {literal {set c [expr {$a + $b}]}} 2: @debug-script {} {literal {expr {$a + $b}}} 3: add {temp 54 1} {var a 8} {var b 14} 4: @debug-script {} {literal {set c [expr {$a + $b}]}} 5: copy {var c 7} {temp 54 1} 6: @debug-line {} {literal 53} 7: @debug-script {} {literal {set a $b}} 8: copy {var a 3} {var b 14} 9: @debug-line {} {literal 54} 10: @debug-script {} {literal {set b $c}} 11: copy {var b 3} {var c 7} 12: @debug-line {} {literal 51} 13: @debug-script {} {literal {for {set i 1} {$i < $n} {incr i} { set c [expr {$a + $b}] set a $b set b $c }}} 14: @debug-script {} {literal {incr i}} 15: add {var i 4} {var i 9} {literal 1} 16: @debug-script {} {literal {for {set i 1} {$i < $n} {incr i} { set c [expr {$a + $b}] set a $b set b $c }}} 17: jump {bb 6} ----------------------------------------------------------------------------- specialise: 149724 microseconds generate: 28624 microseconds dump-pre: 21465 microseconds optimize: 457552 microseconds dump-post: 41872 microseconds assemble: 573578 microseconds ==================TIME (OPTIMISED)================== eval fib 85: "259695496911122585" time fib 85: 0.2702796173657101 microseconds per iteration =====================COMPARISON===================== -------- fib 85 -------- Acceleration 3177.78% =====================1/1 PASSED (1 FASTER)=====================