Posted to tcl by miguel at Fri Oct 26 12:15:24 GMT 2007view raw

  1. # Iterate over lists with for
  2. proc loops-for-list {list} {
  3. set len [llength $list]
  4. for {set i 0} {$i < $len} {incr i} {
  5. set var [lindex $list $i]
  6. }
  7. }
  8.  
  9. # Iterate over lists with foreach
  10. proc loops-foreach-list {list} {
  11. foreach elem $list {
  12. set var $elem
  13. }
  14. }
  15.  
  16. # Looping with for
  17. proc loops-foo-num {size} {
  18. for {set i 0} {$i < $size} {incr i} {
  19. set bogus abc
  20. }
  21. }
  22.  
  23. # Looping with while
  24. proc loops-while-num {size} {
  25. set i 0
  26. while {$i < $size} {
  27. set bogus abc
  28. incr i
  29. }
  30. }
  31.  
  32. # Looping with while
  33. proc loops-while-1 {size} {
  34. set i 0
  35. while {1} {
  36. if {[incr i] > $size} { break }
  37. }
  38. }
  39.  
  40. # iterate over chars in string using [string index]
  41. proc loops-for-string {s} {
  42. set len [string length $s]
  43. for {set i 0} {$i < $len} {incr i} {
  44. set var [string index $s $i]
  45. }
  46. }
  47.  
  48. # iterate over chars in string using [foreach] and [split]
  49. proc loops-foreach-string {s} {
  50. foreach c [split $s {}] {
  51. set var $c
  52. }
  53. }
  54.  
  55. proc go N {
  56. set list {}
  57. set string ""
  58. set size 1000
  59. for {set i 0} {$i < $size} {incr i} {
  60. lappend list $i
  61. append string "0"
  62. }
  63.  
  64. for {set i 0} {$i < $N} {incr i} {
  65. bench -desc "LOOP for, iterate list" \
  66. -body {loops-for-list $list}
  67. bench -desc "LOOP foreach, iterate list" \
  68. -body {loops-foreach-list $list}
  69. bench -desc "LOOP for (to $size)" \
  70. -body {loops-foo-num $size}
  71. bench -desc "LOOP while (to $size)" \
  72. -body {loops-while-num $size}
  73. bench -desc "LOOP while 1 (to $size)" \
  74. -body {loops-while-1 $size}
  75. #bench -desc "LOOP for, iterate string" \
  76. -body {loops-for-string $string}
  77. #bench -desc "LOOP foreach, iterate string" \
  78. -body {loops-foreach-string $string}
  79. }
  80. }
  81.  
  82. proc bench {- name - body} {
  83. uplevel 1 $body
  84. }
  85.  
  86. if {[llength $argv]} {
  87. set num [lindex $argv 0]
  88. } else {
  89. set num 100
  90. }
  91. go $num