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 <a...@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@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 Please visit this url to subscribe, unsubscribe and manage your subscription preferences: http://lists.runrev.com/mailman/listinfo/use-livecode