Reverse a list
Mike Bonner
bonnmike at gmail.com
Sun Feb 8 18:58:44 EST 2015
Yeah, the difference is rather shocking. Really hoping for a major tuneup.
On Sun, Feb 8, 2015 at 4:37 PM, 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
>
More information about the use-livecode
mailing list