Posted to tcl by de at Thu Jan 21 14:00:43 GMT 2021view pretty

#load ./libtdom0.9.3.so
package require tdom 0.9.3

set nrNoise 10
set noiseElement "elementNoise"
set nrMeat 40
set meatPrefix "element"
set size 1000000

proc generateInput {nrNoise noiseElement nrMeat meatPrefix size} {
    set xml "<doc>"
    set names [list]
    for {set i 0} {$i < $nrMeat} {incr i} {
        lappend names $meatPrefix$i
    }
    while {[string length $xml] < $size} {
        for {set i 0} {$i < $nrMeat} {incr i} {
            append xml [string repeat "<$noiseElement/>" $nrNoise]
            append xml "<$meatPrefix$i/>\n"
        }
    }
    append xml "</doc>"
    return [list $xml $names]
}

proc testnames {xml names} {
    tdom::pullparser pp
    pp input $xml
    set result [list]
    pp next
    puts "-names [time {
        while {[pp state] ne "END_DOCUMENT"} {
            lappend result [pp tag]
            pp find-element -names $names
        }
    }]"
    pp delete
}

proc testnameshashed {xml names} {
    tdom::pullparser pp
    pp input $xml
    set result [list]
    pp next
    puts "-names hashed [time {
        while {[pp state] ne "END_DOCUMENT"} {
            lappend result [pp tag]
            pp find-element -names $names -hash
        }
    }]"
    pp delete
}

proc testnameshashednext {xml names} {
    tdom::pullparser pp
    pp input $xml
    set result [list]
    pp next
    puts "-next [time {
        pp find-element -names $names 
        while {[pp state] ne "END_DOCUMENT"} {
            lappend result [pp tag]
            pp find-element -next
        }
    }]"
    pp delete
}

foreach {nrNoise noiseElement nrMeat meatPrefix size} {
    10 "elementNoise" 40 "element" 1000000
    5 "elementNoise" 5 "element" 1000000
    5 "elementNoise" 5 "e" 1000000
    2 "elementNoise" 5 "element" 1000000
    2 "elementNoise" 100 "element" 1000000
    20 "elementNoise" 100 "element" 1000000
    20 "earlydistinct" 100 "element" 1000000
    100 "elementNoise" 20 "element" 1000000
} {
    puts "$nrNoise $noiseElement $nrMeat $meatPrefix $size"
    lassign [generateInput $nrNoise $noiseElement $nrMeat $meatPrefix $size] xml names
    testnames $xml $names
    testnameshashed $xml $names
    testnameshashednext $xml $names
    puts ""
}