compileIt for revolution?

Alex Tweedly alex at tweedly.net
Thu Jun 30 19:48:47 EDT 2005


Sorry - this was sent yesterday, and has been held up by problems 
contacting RunRev site - trying again ....

>Date: Wed, 29 Jun 2005 22:38:50 +0100
>From: Alex Tweedly <alex at tweedly.net>
>Subject: Re: compileIt for revolution?
>Jon wrote:
>
>  
>
>>Derek:
>>
>>Let's put it differently.  My real interest is in seeing how to 
>>optimize Rev code to access arrays in general, and image data in 
>>specific, as rapidly as possible.
>>    
>>
>
>I trust you've already read all the "tricks to optimize code" mentioned 
>on the list last week (in particular, the ones from Ken's sonsothunder site)
>http://www.sonsothunder.com/index2.htm?http://www.sonsothunder.com/devres/revolution/revolution.htm
>
>Accessing arrays in Rev is slow-ish because they are associative. They 
>are quick for assoc arrays, but it's still a look-up.
>
>Access to numbered chunks (e.g. line 3, item K, ...) is dependent on the 
>number being accessed - because it requires a pass through the variable 
>to count chunks. The one big exception to this is character access - 
>char N is a direct lookup (offset N from the start).  So if you can 
>access "char N of variable" that is much faster ....
>
>So the big message for image processing is - don't access it as an 
>array, access it as chars in a variable.
>
>Your Brightness code took (for me, for one med size photo)
> 8.5 seconds to convert from tImagedata into your arrays
> another 8 seconds to ComputeHistogram
>
>By leaving it as tImageData, I could save the conversion time of 8.5 
>seconds.
>*and* I could reduce the ComputeHistogram time from 8 seconds to around 
>2 seconds, by changing
>
>  
>
>>  repeat with r = 1 to imH
>>    repeat with c = 1 to imW
>>      put Brightness(c, r) into i
>>      add 1 to histo[i]
>>    end repeat
>>  end repeat  
>>
>>    
>>
>to (NB uses the fact that the "spare" byte is always zero)
>
>  
>
>>   repeat for each char c in lImageData
>>     add chartonum(c) to temp
>>     add 1 to count
>>     if count = 4 then
>>         add 1 to histo[temp]
>>     end if
>>   put 0 into temp
>>   put 0 into count
>>   end repeat 
>>    
>>
>
>
>
>I realized that this still requires an access to an array for each 
>increment to "histo". It would be great if there were a "direct access" 
>integer variable type, but there isn't. However, if you are desperate 
>enough to save time, you can use "char N" accesss to a temp variable, 
>and then you can convert that into array accesses: thus the section
>
>  
>
>>    if count = 4 then
>>        add 1 to histo[temp]
>>      end if
>>    
>>
>
>becomes
>
>  
>
>>if count = 4 then
>>      add 1 to temp   -- because 1:256, not 0:255
>>      put numtochar(chartonum(char temp of mytemp) + 1) into char temp 
>>of mytemp
>>      if chartonum(char temp of mytemp) = 255 then
>>        add 255 to histo[temp-1]
>>        put czero into char temp of mytemp
>>      end if
>>      put 0 into temp
>>      put 0 into count
>>    end if
>>    
>>
>
>remembering that at the end you need to roll them up
>
>  
>
>>repeat with i = 1 to maxHist+1
>>    add chartonum(char i of mytemp) to histo[i-1]
>>  end repeat
>>    
>>
>
>This rather extreme measure reduces the time to 1.2 seconds.
>
>So in some ways that's a good saving 8 seconds to 1.2 - but in other 
>ways it shows that it's probably flogging a dying horse.
>
>Although I didn't complete it, I believe this technique applied 
>throughout your example would reduce the overall time for this photo of 
>mine from around 55 seconds to 10 or 12 seconds.But the cost is some 
>ugly, barely maintainable code, and it's still beyond the stretch of 
>what a user would be willing to wait for a simple transformation to be done.
>
>
>  
>


-- 
Alex Tweedly       http://www.tweedly.net

-------------- next part --------------
No virus found in this outgoing message.
Checked by AVG Anti-Virus.
Version: 7.0.323 / Virus Database: 267.8.2/29 - Release Date: 27/06/2005


More information about the use-livecode mailing list