for using incr is slower than foreach?

From: Bernd Schmitt (Bernd.Schmitt.News_at_gmx.net)
Date: 02/28/05


Date: Mon, 28 Feb 2005 01:31:02 +0100

Hello I wonder, what I am doing wrong.
I still have to simulate transparency for my picture stitching program,
so I a doing something like this:

###
for {set x 0; set Mx [image width $b2(use)]; /
   set My [image height $b2(use)]; } {$x < $Mx} {incr x 2} {
     for {set y 0} {$y < $My} {incr y; incr y} {
       $b2(use) transparency set $x $y 1}}
###

Ok, Jeff Hobbs told me to use png, but this would be to complicated at
the moment. So my problem is, that above procedure is very slow. In
order to improve speed, I tried to use foreach:

###
proc old {x xi y yi} {
     set counter 0;
     for {set i 0} {$i < $x} {incr i $xi} {
         for {set j 0} {$j < $y} {incr j $yi} {
             incr counter }}
     puts "*old* x=$x xi=$xi y=$y yi=$yi counter=$counter";
}

proc new {x xi y yi} {
     set counter 0;

     for {set i 0} {$i < $x} {incr i $xi} {
         lappend lx $i;}
     for {set i 0} {$i < $y} {incr i $yi} {
         lappend ly $i;}

     foreach i $lx {
         foreach j $ly {
             incr counter}}
     puts "*foreachtest* x=$x xi=$xi y=$y yi=$yi counter=$counter";
}

proc test {x xi y yi} {
     puts [time {old $x $xi $y $yi}];
     puts [time {new $x $xi $y $yi}];
}

set x 1000
set y 1000

for {set i 1} {$i < 10} {incr i} {
     test $x $i $y $i}
exit 0

###

And the result is somehow irritating:
*old* x=1000 xi=1 y=1000 yi=1 counter=1000000
672943 microseconds per iteration
*foreachtest* x=1000 xi=1 y=1000 yi=1 counter=1000000
535287 microseconds per iteration
*old* x=1000 xi=2 y=1000 yi=2 counter=250000
163062 microseconds per iteration
*foreachtest* x=1000 xi=2 y=1000 yi=2 counter=250000
138536 microseconds per iteration
*old* x=1000 xi=3 y=1000 yi=3 counter=111556
77946 microseconds per iteration
*foreachtest* x=1000 xi=3 y=1000 yi=3 counter=111556
60014 microseconds per iteration
*old* x=1000 xi=4 y=1000 yi=4 counter=62500
40280 microseconds per iteration
*foreachtest* x=1000 xi=4 y=1000 yi=4 counter=62500
34612 microseconds per iteration
*old* x=1000 xi=5 y=1000 yi=5 counter=40000
26956 microseconds per iteration
*foreachtest* x=1000 xi=5 y=1000 yi=5 counter=40000
21083 microseconds per iteration
*old* x=1000 xi=6 y=1000 yi=6 counter=27889
21010 microseconds per iteration
*foreachtest* x=1000 xi=6 y=1000 yi=6 counter=27889
17520 microseconds per iteration
*old* x=1000 xi=7 y=1000 yi=7 counter=20449
13242 microseconds per iteration
*foreachtest* x=1000 xi=7 y=1000 yi=7 counter=20449
10861 microseconds per iteration
*old* x=1000 xi=8 y=1000 yi=8 counter=15625
10144 microseconds per iteration
*foreachtest* x=1000 xi=8 y=1000 yi=8 counter=15625
8355 microseconds per iteration
*old* x=1000 xi=9 y=1000 yi=9 counter=12544
8165 microseconds per iteration
*foreachtest* x=1000 xi=9 y=1000 yi=9 counter=12544
6741 microseconds per iteration

Did I do something wrong? How would you do things like this?

Thanks,
Bernd


Quantcast