How to replace just the first found space with tab for all lines in a variable?
Nonsanity
form at nonsanity.com
Thu May 26 10:48:11 EDT 2011
You are absolutely right here. I always forget about the "repeat for each"
form because it wasn't in Hypercard back in the day. I'm just SO damn used
to typing "repeat with a =" that I forget there's another option.
Yes, the speed increase from that form of repeat FAR more than makes up for
any speed increase from changing in-place. I even tested it against a faster
char by char sweep to replace the first space of each line with a tab
in-place, and it beat it 3 ticks to 49.
So yeah... Go with the "for each" solution. :)
~ Chris Innanen
~ Nonsanity
On Thu, May 26, 2011 at 6:32 AM, Alex Tweedly <alex at tweedly.net> wrote:
> On 25/05/2011 16:48, Nonsanity wrote:
>
>> And if this is a one-shot utility function, than any of these solutions
>> that
>> work for you are great. But if you will be doing this as a feature of a
>> program, and the amounts of data you'll be pushing through are large, then
>> modifying the data in-place saves time and memory over copying large
>> quantities of text between two variables. Just sayin'. :)
>>
> That's true - in general, but not in this case.
>
> The big exception is that "line a of myText" is quite expensive in LC. In
> fact, it is VERY expensive, because the engine needs to scan the text to
> find the line, which means that operations such as
>
> repeat with a = 1 to the number of lines in myText
>> if space is not in line a of myText then next repeat
>> put tab into char (offset( space, line a of myText )) of line a of
>> myText
>> end repeat
>>
> take time based on the square of the number of chars/lines in the data.
>
> On the other hand, copying from one variable to another takes linear time
> based on the number of chars/lines, and
>
> repeat for each line L in myText
> ...
> put theModifiedLine & CR after tOutputData
> end repeat
>
> is also linear (so long as it is "put xxx *after* tOutputData" because
> simply appending is linear).
>
> So, taking the benchmark that Jim recently sent, and adding the alternative
> version which modifes it in place, we see that modifying in place is very,
> very slow by comparison.
>
> On my Macbook Pro, the "copy" method takes 1 tick while the "in place"
> version takes around 820 (btw - I changed the number of lines down to 20000;
> estimated time for the original count would have been too slow).
>
> --- working code ----
> on mouseUp
> trythisForSpeed
> end mouseUp
>
>
> on trythisForSpeed
>
> put 20000 into weaponOfMassConstruction
>
>
> repeat weaponOfMassConstruction times
> get the seconds
> put IT && IT && IT & cr after massiveList
> end repeat
>
> put the ticks into startt
> repeat for each line tLine in massiveList
>
> put word 1 of tLine& tab& word 2 to -1 of tLine& return after
> tResultTable
> end repeat
> filter tResultTable without empty
>
> put the ticks - startt into elapsedTks
> if elapsedTks = 0 then
> put "Too fast to measure 'cause it took less than 1 tick" & CR
>
> else
> put "elapsed =" && elapsedTks && "ticks thus" \
> && elapsedTks/60 && "seconds" & cr \
> && "or" && weaponOfMassConstruction/elapsedTks \
> && "address lines per tick" & cr \
> && "or approx" \
> && 60*(weaponOfMassConstruction/elapsedTks) \
> && "per second" & CR
>
> end if
>
>
> put the ticks into startt
> repeat with I = 1 to the number of lines in massiveList
> -- if space is not in line I of myText then next repeat
> put tab into char (offset( space, line I of massiveList )) of line I
> of massiveList
> end repeat
>
> put the ticks - startt into elapsedTks
> if elapsedTks = 0 then
> put "Too fast to measure 'cause it took less than 1 tick" & CR after
> msg
>
> else
> put "elapsed =" && elapsedTks && "ticks thus" \
> && elapsedTks/60 && "seconds" & cr \
> && "or" && weaponOfMassConstruction/elapsedTks \
> && "address lines per tick" & cr \
> && "or approx" \
> && 60*(weaponOfMassConstruction/elapsedTks) \
> && "per second" & CR after msg
>
> end if
>
> end trythisForSpeed
>
> _______________________________________________
> 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