Re: processing time & stack overflow
Re: processing time & stack overflow
- Subject: Re: processing time & stack overflow
- From: Victor Yee <email@hidden>
- Date: Fri, 31 Aug 2001 00:12:56 -0400
On Wed, 29 Aug 2001 11:43:43 -0400, Arthur J Knapp wrote,
>
> After playing with this 'cross cutting' script for a while, I would have to
>
> conclude that having AppleScript very large lists isn't a good idea.
>
>
Speed improvments with large lists can often be achived by using the
>
"a ref to" operator:
You know, I feel really obtuse. This didn't even click in until just now.
22 seconds for a 10,000 word file.
(I think I'll hide for a while...)
Victor
--
set sourceFile to (choose file with prompt "choose source to juxtapose:")
set numberOfFiles to "1"
repeat until class of numberOfFiles is integer and numberOfFiles > 0 and numberOfFiles < 100
try
display dialog "enter amount of files to generate from source (1-99)?" default answer numberOfFiles giving up after 12
set numberOfFiles to text returned of the result as integer
on error
display dialog "that wasn't the right kind of number!"
end try
end repeat
set juxtaFolder to (path to desktop as string) & "juxtatext(s)"
tell application "Finder"
--activate
if not (exists folder juxtaFolder) then
make new folder at desktop with properties {name:"juxtatext(s)"}
end if
open folder juxtaFolder
set size of window of folder juxtaFolder to {253, 527}
set view of window of folder juxtaFolder to kind
end tell
set juxtaFolder to (alias juxtaFolder) as string
--Get start time.
set startTime to (current date)
set sourceFile to open for access sourceFile
try
set sourceAsList to (read sourceFile as list using delimiter {return, space})
close access sourceFile
on error
close access sourceFile
beep
error number -128
end try
--Use a reference to the really big list.
set listRef to a reference to sourceAsList
repeat with x from 1 to numberOfFiles
--Arthur's handler inline.
set {s1, s2, len} to ,
{random number from 1 to 100000, 31415, sourceAsList's length}
repeat with i from 1 to len
set {j, s1} to {(s1 mod len) + 1, (s1 * s2) mod len}
set {listRef's item i, listRef's item j} to ,
{listRef's item j, listRef's item i}
end repeat
--Write to file.
set text item delimiters to {" "}
set oldTIDs to text item delimiters
set fileName to "juxtatext " & characters -2 thru -1 of ("0" & x)
set fileRef to open for access file ("" & juxtaFolder & fileName) with write permission
try
write (listRef as string) to fileRef starting at eof
close access fileRef
on error
close access fileRef
end try
set text item delimiters to oldTIDs
end repeat
--Get stop time and display total time.
set endTime to (current date)
set totalTime to endTime - startTime
display dialog "Total processing time: " & ,
text -2 thru -1 of ("0" & (totalTime div 3600)) ,
& ":" & text -2 thru -1 of ("0" & (totalTime mod 3600) div 60) ,
& ":" & text -2 thru -1 of ("0" & totalTime mod 60)
--Flush out variable before quitting.
set sourceAsList to {}