# testmatrix.tcl # Test a variety of ways to create and update a matrix # (implemented as a list of lists) and find out which is # the fastest # proc buildup { norows nocols } { # # Use a nested for-loop to create and expand the lists # set newmat {} for { set j 0 } { $j < $norows } { incr j } { set newrow {} for { set i 0 } { $i < $nocols } { incr i } { lappend newrow [expr {rand()}] } lappend newmat $newrow } return $newmat } proc copy_and_update { matrix } { # # Use an existing matrix as a template, copy this and # update the entries # set newmat $matrix set r 0 foreach row $newmat { set c 0 foreach col $row { lset newmat $r $c [expr {rand()}] incr c } incr r } return $newmat } proc template_and_buildup { matrix } { # # Use an existing matrix as a template and # construct a new matrix via foreach-loops # set newmat {} foreach row $matrix { set newrow {} foreach col $row { lappend newrow [expr {rand()}] } lappend newmat $newrow } return $newmat } foreach size {10 20 50 100} times {10000 3000 1000 1000} { puts "Size: $size" puts "Build up: [time {buildup $size $size} $times]" set matrix [buildup $size $size] puts "Copy and update: [time {copy_and_update $matrix} $times]" puts "Template and build up: [time {template_and_buildup $matrix} $times]" }
Here is the result with Tcl 8.4.5, on Windows XP, fairly fast hardware (but the relative speeds are more important):
Size: 10 Build up: 81 microseconds per iteration Copy and update: 103 microseconds per iteration Template and build up: 78 microseconds per iteration Size: 20 Build up: 273 microseconds per iteration Copy and update: 368 microseconds per iteration Template and build up: 260 microseconds per iteration Size: 50 Build up: 1534 microseconds per iteration Copy and update: 2279 microseconds per iteration Template and build up: 1499 microseconds per iteration Size: 100 Build up: 5936 microseconds per iteration Copy and update: 9262 microseconds per iteration Template and build up: 5781 microseconds per iterationConclusion from this (and another test, Tcl 8.4.1 on WIndows 98):
- Rebuilding a list of lists is definitely faster than updating the entries
- Using [foreach] seems slightly faster than [for] loops
[ Category Numerical Analysis ]