# Re: Atkinson dither algorithm & 'for each' loop

```HI All

Hoping I'm not teaching my granny to suck eggs ... Here is a great article
I remembered reading  from a few years ago. It's easy to find on google so
you probably know of it ...```
```
http://www.tannerhelland.com/4660/dithering-eleven-algorithms-source-code/

In any case his projects and how he writes about them are interesting

http://www.tannerhelland.com/programming-directory/

Lagi

On 12 October 2017 at 12:05, Peter Reid via use-livecode <
use-livecode@lists.runrev.com> wrote:

> One note of caution regarding the use of the "repeat for each" loop,
> whilst you will get a loop iteration for every value in the collection
> (fldhexa3 in your example), you are not guaranteed the order in which they
> will occur.  This doesn't matter in a lot of cases but does matter when the
> sequence is significant.  In the case of your example I believe sequence is
> critical, otherwise the pixels might appear to be scrambled!
>
> The following adjusted loop guarantees the sequence at the expense of
> speed:
>
>   put 1 into i
>   repeat for each word theWord in fldhexa3
>      put word i of fldhexa3 into theWord
>      put 00 & theword & theword & theword after tVar2
>   end repeat
>
> The original "improved" loop reduces the run-time to 25%.  However, the
> "modified improved" loop only manages to reduce the original run-time to
> 50%.
>
> The suggested loop above takes advantage of the "for each" mechanism to
> produce a set of iterations very rapidly but gets slowed by the need to
> guarantee sequence. I wonder whether the LC engine could impose strict
> sequence more effectively with a variant of the "for each" loop such as
>
>   repeat for each sequenced word x in theCollection
>      ...
>   end repeat
>
> My own tests, comparing the speed of the 4 common repeat loops, imply that
> the current "for each" form is hugely faster than the others.  I tested
> "repeat for each...", "repeat while...", "repeat until...", "repeat
> with..." and a simulated "repeat for each sequenced..." forms using a
> simple loop body that added lines of text one after another, e.g.
>
>   put empty into tData
>   repeat with i = 1 to tMaxI
>     put line i of tList & return after tData
>   end repeat
>
> I ran this test for 250,000 iterations for each type of loop, which
> produced the following timings:
>
>   Starting test for 250,000 iterations...
>   repeat for each... 0 mins 0 secs 111 millisecs
>   repeat while... 0 mins 30 secs 569 millisecs
>   repeat until... 0 mins 30 secs 379 millisecs
>   repeat with... 0 mins 30 secs 341 millisecs
>   repeat for each seq... 0 mins 30 secs 524 millisecs
>
> As you can see, in this test the "repeat for each..." form was approx. 275
> times faster than the other forms.  Also the simulated "repeat for each
> sequenced..." form was no faster than the other forms.  This shows how
> variable the speed will be with the simulated "repeat for each
> sequenced...", depending on the details of the loop body.
>
> If there was a "repeat for each sequenced..." form of loop in LC, any
> speed-up could be very beneficial even if the amount of speed-up was only
> 10 times faster!
>
> Cheers
>
> Peter
> --
> Peter Reid
> Loughborough, UK
>
> > On 9 Oct 2017, at 10:18am, use-livecode-requ...@lists.runrev.com wrote:
> >
> > Message: 12
> > Date: Sat, 7 Oct 2017 15:53:44 +0200
> > From: Malte Pfaff-Brill <revolut...@derbrill.de>
> > To: use-livecode@lists.runrev.com
> > Subject: Re: Atkinson dither algorithm
> > Message-ID: <42023b36-0a4e-4251-bb0c-9cd46de55...@derbrill.de>
> > Content-Type: text/plain; charset=us-ascii
> >
> > Hi Al,
> >
> > I already posted on the forums, but for completeness also here:
> >
> > a lot can be done by replacing repeat with with repeat for each where
> you can.
> >
> > --    repeat with i = 1 to the number of words of fldhexa3
> >   --       put 00 & word i of fldhexa3 & word i of fldhexa3 & word i of
> fldhexa3 after tVar2
> >   --    end repeat
> >
> >   repeat for each word theWord in fldhexa3
> >      put 00 & theword & theword & theword after tVar2
> >   end repeat
> >
> >
> > A sidenode:
> >
> > I always use strict compile mode, therefore I added the needed variable
> declarations and noticed you use startTime as a variablename, which is a
> reserved keyword. That is not a good idea.  (I noticed, because I managed
> to freeze liveCode where I fixed only half of the use of startTime. Booom.)
> >
> > Cheers,
> >
> > malte
>
>
> _______________________________________________
> use-livecode mailing list
> use-livecode@lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your
> subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode
>
_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com