Posted to tcl by de at Wed Feb 28 13:58:12 GMT 2018view pretty

# Run this script w/ 8.6.8 tclsh 
#
# Do the same w/ 8.5.19.

package require tdom

# Canonical
expat pushparserCanonical \
    -elementstartcommand elementstart 

proc elementstart {name atts} {
    global str
    
    append str $name
}

puts [tcl::unsupported::disassemble proc elementstart]

# Tricky (Welch).
expat pushparserTricky \
    -elementstartcommand elementstart 

# We need some larger XML file
#
# Lemme create that for you, just for convenience. Any larger input by
# your own should do it also.
set xml "<doc>"
lappend xml [string repeat "<some><child>data</child></some>" 20000]
lappend xml "</doc>"

puts "Canonical:"
puts [time {pushparserCanonical parse $xml}]
puts ""
puts "Tricky (Welch):"
puts [time {pushparserTricky parse $xml}]



With tcl 8.5:
ByteCode 0x0x94d0f0, refCt 1, epoch 3, interp 0x0x878c80 (epoch 3)
  Source "\n    global str\n    \n    append str $name\n"
  Cmds 2, src 42, inst 27, litObjs 3, aux 0, stkDepth 2, code/src 0.00
  Proc 0x0x923ac0, refCt 1, args 2, compiled locals 3
      slot 0, scalar, arg, "name"
      slot 1, scalar, arg, "atts"
      slot 2, scalar, "str"
  Commands 2:
      1: pc 0-12, src 5-14         2: pc 13-25, src 25-40
  Command 1: "global str"
    (0) push1 0         # "::"
    (2) push1 1         # "str"
    (4) nsupvar %v2     # var "str"
    (9) pop 
    (10) push1 2        # ""
    (12) pop 
  Command 2: "append str $name"
    (13) startCommand +13 1     # next cmd at pc 26
    (22) loadScalar1 %v0        # var "name"
    (24) appendScalar1 %v2      # var "str"
    (26) done 

Canonical:
93046 microseconds per iteration

Tricky (Welch):
33559 microseconds per iteration


With 8.6:

ByteCode 0x0xdc4d00, refCt 1, epoch 17, interp 0x0xc2ad10 (epoch 17)
  Source "\n    global str\n    \n    append str $na..."
  File "/home/rolf/hack/tdom-pull/unix/pg3.tcl" Line 12
  Cmds 2, src 42, inst 27, litObjs 3, aux 0, stkDepth 2, code/src 0.00
  Proc 0x0xd017d0, refCt 1, args 2, compiled locals 3
      slot 0, scalar, arg, "name"
      slot 1, scalar, arg, "atts"
      slot 2, scalar, "str"
  Commands 2:
      1: pc 0-12, src 5-14        2: pc 13-25, src 25-40
  Command 1: "global str..."
    (0) push1 0         # "::"
    (2) push1 1         # "str"
    (4) nsupvar %v2     # var "str"
    (9) pop 
    (10) nop 
    (11) nop 
    (12) nop 
  Command 2: "append str $name..."
    (13) startCommand +13 1     # next cmd at pc 26, 1 cmds start here
    (22) loadScalar1 %v0        # var "name"
    (24) appendScalar1 %v2      # var "str"
    (26) done 

Canonical:
101761 microseconds per iteration

Tricky (Welch):
3030611 microseconds per iteration