Reverse a list
Mike Kerner
MikeKerner at roadrunner.com
Mon Feb 9 09:12:09 EST 2015
What about using an index, instead of the actual data? With the times
quoted in 7, I wonder if using an SQLite or mySQL db would be faster.
On Mon, Feb 9, 2015 at 7:03 AM, Dave Cragg <dave.cragg at lacscentre.co.uk>
wrote:
> I tried an array method:
>
>
> function arevers p
> split p by cr
> put empty into t
> put the number of lines in the keys of p into tNumElems
> repeat with i = tNumElems down to 1
> put p[i] & cr after t
> end repeat
> return t
> end arevers
>
> This is slower than Alex's method in 6.0.2 (21 ms vs 9ms). And while
> slower in 7.0.1, now much faster that Alex's method. (74 ms vs 446ms)
>
> The increase in speed of the "put before" method was interesting (from
> 242ms to 92ms)
>
>
> Cheers
> Dave Cragg
>
>
> > On 8 Feb 2015, at 23:37, Alex Tweedly <alex at tweedly.net> wrote:
> >
> > Wow. I can see why LC7 would be expected to be slower for this case - in
> the multi-byte Unicode world, char indexing isn't as simple as it used to
> be. BUT in this specific case, you can actually replace all use of "char"
> by "byte" and still be sure it works (ummm - except if the CR equivalent
> can be multi-byte - but I'll choose to ignore that :-) However, using
> position by byte is just as slow !!
> >
> > I'll have to play around a bit more to see if I can fathom out why that
> should be.
> >
> > - -Alex.
> >
> > On 08/02/2015 23:18, Mike Bonner wrote:
> >> Version 6.6.2, your "by position" method is by FAR the fastest 26
> millisec
> >> for 80k lines. repeat takes almost 9 seconds. The sort function method
> >> not passing text back and forth, takes 102 millisec which isn't
> slouchy by
> >> any means.
> >>
> >> Jump to version 7.0.1 and the by position method needs some major love.
> >> The repeat method is almost twice as fast in 7, the sort without passing
> >> the text method is within a few millisec of 6.6.2, and the by position
> >> method is unusable at 21 seconds. REALLY hope they get some
> optimization
> >> going soon.
> >>
> >> On Sun, Feb 8, 2015 at 3:37 PM, Alex Tweedly <alex at tweedly.net> wrote:
> >>
> >>> Indeed. Jerry was (as usual) correct - if the engine can do it, then
> the
> >>> engine will normally be faster.
> >>>
> >>> BUT sorting a list requires moving the data around quite a lot, AND
> >>> sorting something that actually reverses it can be a pathologically bad
> >>> case (e.g. if the engine uses any variant of quicksort())..
> >>>
> >>> SO - take the original idea, and examine how it *might* be improved
> .....
> >>>
> >>> The problem here is that "put ... before ..." requires all existing
> data
> >>> in the destination container to be moved (i.e. copied) to make space.
> >>>
> >>> SO, instead, we can use "put ... into char x to y of ..." - since it
> uses
> >>> char indexing, it takes constant time (i.e. no scan, just directly
> replace
> >>> the chars. I've attached my complete code so anyone can try it easily
> -
> >>> for my test data of approx 8000 lines, this takes 8 msecs, versus 588
> for
> >>> the original version.
> >>>
> >>> -- Alex.
> >>>
> >>> on mouseup
> >>> put fld "fldout" into tstart
> >>>
> >>> put tstart into ta
> >>> repeat 200 times
> >>> put tstart after ta
> >>> end repeat
> >>> put ta into tstart
> >>>
> >>> put the millisecs into t1
> >>> put revers(ta) into tb
> >>> put the millisecs - t1 & CR after msg
> >>>
> >>> put tstart into ta
> >>> put the millisecs into t1
> >>> put qrevers(ta) into tc
> >>> put the millisecs - t1 & CR after msg
> >>>
> >>> if tb = tc then put "OK" after msg
> >>> end mouseup
> >>>
> >>> function revers p
> >>> repeat for each line l in p
> >>> put L &CR before t
> >>> end repeat
> >>> return t
> >>> end revers
> >>>
> >>> function qrevers p
> >>> put p into t
> >>> put the number of chars in t into tlen
> >>> repeat for each line l in p
> >>> put the number of chars in l into tl
> >>> put l & cr into char (tLen-tl) to tLen of t
> >>> subtract (tl+1) from tLen
> >>> end repeat
> >>> return t
> >>> end qrevers
> >>>
> >>>
> >>> On 08/02/2015 21:52, J. Landman Gay wrote:
> >>>
> >>>> Just tinkering around on a lazy Sunday, and I thought I'd come up
> with a
> >>>> neat way to reverse a list without using the traditional clunky
> method:
> >>>>
> >>>> function reverseSort pList
> >>>> repeat for each line l in pList
> >>>> put l & cr before tList
> >>>> end repeat
> >>>> return tList
> >>>> end reverseSort
> >>>>
> >>>> One of the best things I learned from a past LC converence came from
> >>>> Jerry Daniels who said "let the engine do it." It's almost always
> faster
> >>>> and more efficient. With that in mind I wrote this:
> >>>>
> >>>> local sNum
> >>>>
> >>>> function reverseText pList
> >>>> put the number of lines in pList into sNum
> >>>> sort lines of pList numeric by reverseSort(each)
> >>>> return pList
> >>>> end reverseText
> >>>>
> >>>> function reverseSort pTxt
> >>>> subtract 1 from sNum
> >>>> return sNum && pTxt
> >>>> end reverseSort
> >>>>
> >>>> Works great and I was proud. Then I did some timing tests and found
> out
> >>>> the two methods are very close to equivalent in timing, and on long
> lists,
> >>>> the first way is actually faster.
> >>>>
> >>>> So much for improving on LC's text chunking speed. Pah.
> >>>>
> >>>>
> >>> _______________________________________________
> >>> use-livecode mailing list
> >>> use-livecode at 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 at 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 at 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 at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your
> subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode
>
--
On the first day, God created the heavens and the Earth
On the second day, God created the oceans.
On the third day, God put the animals on hold for a few hours,
and did a little diving.
And God said, "This is good."
More information about the use-livecode
mailing list