SetOps, Create, Timing Script

# -*- tcl -*-
# test = create

set max 50

proc testA {list} {
    if {[llength $list] == 0} {
        return {}
    }
    if {[llength $list] == 1} {
        return $list
    }
    foreach e $list {
        set aa($e) .
    }
    array names aa
}

proc testB {list} {
    if {[llength $list] == 0} {
        return {}
    }
    if {[llength $list] == 1} {
        return $list
    }

    set list [lsort $list]
    set last [lindex $list 0]
    set list [lrange $list 1 end]
    set res  $last

    foreach e $list {
        if {[string compare $e $last] != 0} {
            lappend res $e
            set last    $e
        }
    }

    return $res
}

proc testC {list} {
    if {[llength $list] == 0} {
        return {}
    }
    foreach e $list {
        set $e .
    }
    unset list e
    info locals
}

proc testD {list} {
    if {[llength $list] == 0} {
        return {}
    }
    foreach $list {.} {break}
    unset list
    info locals
}

 set fa1  [open "|./2nep CR_A Ar.dat X.dat" w]
 set fb1  [open "|./2nep CR_B Br.dat X.dat" w]
 set fc1  [open "|./2nep CR_B Cr.dat X.dat" w]
 set fd1  [open "|./2nep CR_B Dr.dat X.dat" w]
 set fx   [open "|./2nep CR_X X.dat" w]

 set a0 {}

 puts stdout " ______________________________________" ; flush stdout
 puts stdout " CREA | ......A ......B ......C ......D" ; flush stdout
 puts stdout " ______________________________________" ; flush stdout

 for {set i 0} {$i <= $max} {incr i} {
    set ix [format %03d $i]

    puts stderr "   * $ix (a0) =  $a0" ; flush stderr

    set ra1  [lindex [time {testA $a0} 1000] 0]
    set rb1  [lindex [time {testB $a0} 1000] 0]
    set rc1  [lindex [time {testC $a0} 1000] 0]
    set rd1  [lindex [time {testD $a0} 1000] 0]

    puts stdout " $ix  | [format %7d $ra1] [format %7d $rb1] [format %7d $rc1] [format %7d $rd1]"

    puts $fa1 $ra1
    puts $fb1 $rb1
    puts $fc1 $rc1
    puts $fd1 $rd1
    puts $fx  $i

    lappend a0 [string range [lindex [split [expr {rand()}] .] 1] 0 4]
 }

 puts stderr "----"     ; flush stderr
 puts stdout " ______________________________________" ; flush stdout

 close $fa1
 close $fb1
 close $fc1
 close $fd1
 close $fx

See also SetOps.