Posted to tcl by hypnotoad at Thu May 11 12:19:25 GMT 2017view raw
- proc foreach* {args} {
- set script [lindex $args end]
- set args [lrange $args 0 end-1]
- set dictval [concat {*}[lmap {k _} $args {string cat "[list $k] \[set [list $k]\]"}]]
- set script "set values \[dict create $dictval\]\n $script"
- foreach {b a} [lreverse $args] {
- set script [list foreach $a $b $script]
- }
- tailcall {*}$script
- }
- proc permutation_level {combinations body valuevar values level} {
- incr level
- foreach {field valuelist} $combinations {
- if {[dict exists $values $field]} continue
- if {[llength $valuelist]==0} {
- dict set values $field {}
- permutation_level $combinations $body $valuevar $values $level
- } else {
- foreach value $valuelist {
- dict set values $field $value
- permutation_level $combinations $body $valuevar $values $level
- }
- }
- return
- }
- upvar $level $valuevar _thevals
- set _thevals $values
- uplevel $level $body
- }
- proc permutation {combinations body {valuevar values}} {
- set body [list dict with $valuevar $body]
- permutation_level $combinations $body $valuevar {} 1
- }
- proc benchmark DATASET {
- # Shimmer DATASET to be a list
- llength $DATASET
- set trial 0
- set start [clock clicks]
- foreach* {*}$DATASET {
- set foreach*_clicks([incr trial]) [expr {[clock clicks]-$start}]
- }
- set end [clock clicks]
- puts [list foreach* [expr {$trial+1}] entries total time: [expr {$end-$start}] first: ${foreach*_clicks(1)}]
- #parray foreach*_clicks
- set trial 0
- set start [clock clicks]
- permutation $DATASET {
- set permutation_clicks([incr trial]) [expr {[clock clicks]-$start}]
- }
- set end [clock clicks]
- puts [list permutation [expr {$trial+1}] entries total time: [expr {$end-$start}] first: $permutation_clicks(1)]
- #parray permutation_clicks
- }
- puts "Small Dataset"
- set DATASET {
- compartment {5compt}
- generator {one two three}
- switchboard {one two three}
- }
- benchmark $DATASET
- puts "Larger Dataset"
- set DATASET {
- compartment {5compt 8compt}
- generator {one two three}
- switchboard {one two three}
- cwplant {single double}
- cwloop {single portstarb foraft psfa}
- }
- benchmark $DATASET
- puts "Huge Dataset"
- set DATASET {
- compartment {5compt 8compt 16compt cruiser}
- generator {one two three four}
- switchboard {one two three}
- cwplant {single double triple quad}
- cwloop {single portstarb foraft psfa}
- propulsion {diesel gtm hybrid}
- helocopter {none mh60 mh60+uav 2mh60 2uav}
- dc_locker {one two three four}
- }
- benchmark $DATASET
- # Results:
- #Small Dataset
- #foreach* 10 entries total time: 103 first: 84
- #permutation 10 entries total time: 120 first: 80
- #Larger Dataset
- #foreach* 145 entries total time: 315 first: 43
- #permutation 145 entries total time: 871 first: 20
- #Huge Dataset
- #foreach* 46081 entries total time: 109106 first: 56
- #permutation 46081 entries total time: 266426 first: 39
- ###