Version 5 of Concatenating lists

Updated 2006-10-06 13:44:02

From a recent query on The comp.lang.tcl newsgroup on combining 2 list into a single list:

Here is the test code used:

 proc SET         {l1 l2} { set l1 "$l1 $l2" }
 proc APPEND      {l1 l2} { append l1 " $l2" }
 proc CONCAT      {l1 l2} { set l1 [concat $l1 $l2] }
 proc EVAL/LAPPEND {l1 l2} { eval [list lappend l1] $l2 }
 proc FOREACH/LAPPEND {l1 l2} {foreach i $l2 {lappend l1 $i} ; set l1}
 set cases "SET APPEND CONCAT EVAL/LAPPEND FOREACH/LAPPEND"

 proc makeList {len item} {
     for {set i 0} {$i< $len} {incr i} {
         lappend res $item
     }
     return $res
 }

 proc testem {len} {
     global cases
     set res {}
     foreach p $cases {
         catch {unset l1}
         catch {unset l2}
         set l1 [makeList $len a]
         set l2 [makeList $len b]
         puts -nonewline stderr "$p..." ; flush stderr
         lappend res $p,$len [lindex [time {llength [$p $l1 $l2]} 1000] 0]
     }
     return $res
 }


 foreach l {10 100 1000 10000} {
     puts -nonewline stderr "testing size $l..." ; flush stderr
     array set data [testem $l]
     puts stderr done ; flush stderr
 }

 puts "Tcl Version - [info patchlevel]\n"

 set fmtstr "| %15s | %6d | %6d | %6d | %6d |"
 set divid  "|-----------------|--------|--------|--------|--------|"
 set ends  "|-----------------------------------------------------|"

 puts $ends
 puts [format $fmtstr Method 10 100 1000 10000]
 puts $divid

 foreach p $cases {
     puts [format $fmtstr $p \
                 $data($p,10) $data($p,100) \
                 $data($p,1000) $data($p,10000)]
 }

 puts $ends


And here are the results on an oLder alPha box running Tru64 UNIX

 Tcl Version - 7.4p3
 |-----------------------------------------------------|
 |          Method |     10 |    100 |   1000 |  10000 |
 |-----------------|--------|--------|--------|--------|
 |             SET |     14 |     45 |   1298 |  12978 |
 |          APPEND |     13 |     43 |   1474 |  12787 |
 |          CONCAT |     17 |     57 |   1639 |  15712 |
 |    EVAL/LAPPEND |     29 |    104 |   3494 |  34986 |
 | FOREACH/LAPPEND |     42 |    796 |  10501 | 105971 |
 |-----------------------------------------------------|

 Tcl Version - 7.5  
 |-----------------------------------------------------|
 |          Method |     10 |    100 |   1000 |  10000 |
 |-----------------|--------|--------|--------|--------|
 |             SET |     15 |     45 |   1334 |  13277 |
 |          APPEND |     14 |     45 |   1396 |  12904 |
 |          CONCAT |     18 |     54 |   1632 |  16561 |
 |    EVAL/LAPPEND |     26 |    108 |   3635 |  36794 |
 | FOREACH/LAPPEND |     44 |    832 |  11428 | 114468 |
 |-----------------------------------------------------|

 Tcl Version - 7.6
 |-----------------------------------------------------|
 |          Method |     10 |    100 |   1000 |  10000 |
 |-----------------|--------|--------|--------|--------|
 |             SET |     21 |     64 |   1592 |  17324 |
 |          APPEND |     21 |     62 |   1801 |  15949 |
 |          CONCAT |     28 |     72 |   2237 |  19821 |
 |    EVAL/LAPPEND |     43 |    719 |   6153 |  66896 |
 | FOREACH/LAPPEND |     80 |   2261 |  22370 | 232325 |
 |-----------------------------------------------------| 

 Tcl Version - 8.0
 |-----------------------------------------------------|
 |          Method |     10 |    100 |   1000 |  10000 |
 |-----------------|--------|--------|--------|--------|
 |             SET |     20 |    146 |   6727 |  61365 |
 |          APPEND |     27 |    215 |   7527 |  72501 |
 |          CONCAT |     21 |    661 |   6224 |  63780 |
 |    EVAL/LAPPEND |     34 |    344 |   3140 |  24726 |
 | FOREACH/LAPPEND |     37 |   1018 |  10688 | 107653 |
 |-----------------------------------------------------|

 Tcl Version - 8.2.0
 |-----------------------------------------------------|
 |          Method |     10 |    100 |   1000 |  10000 |
 |-----------------|--------|--------|--------|--------|
 |             SET |     20 |    145 |   6611 |  67115 |
 |          APPEND |     28 |    176 |   7485 |  78008 |
 |          CONCAT |     21 |    598 |   6069 |  67277 |
 |    EVAL/LAPPEND |     31 |    172 |   2805 |  26525 |
 | FOREACH/LAPPEND |     36 |    925 |  10676 | 108879 |
 |-----------------------------------------------------| 

 Tcl Version - 8.4a4
 |-----------------------------------------------------|
 |          Method |     10 |    100 |   1000 |  10000 |
 |-----------------|--------|--------|--------|--------|
 |             SET |     21 |    150 |   6555 |  69080 |
 |          APPEND |     28 |    391 |   8172 |  82023 |
 |          CONCAT |      9 |     14 |    338 |   5830 |
 |    EVAL/LAPPEND |     15 |     28 |    795 |   5956 |
 | FOREACH/LAPPEND |     19 |    530 |   4259 |  45044 |
 |-----------------------------------------------------|

How do I interpret these results?