Is there a faster way?

Dar Scott dsc at swcp.com
Sun Jun 29 16:17:01 EDT 2003


On Sunday, June 29, 2003, at 02:00 PM, T. R. Ponn wrote:

> Thanks, but I forgot to mention I tried that...and surprisingly, it 
> ran slower (about 27 seconds for that file):
>
>  if char 1 of memBank="0" then put "false" into toggle else put "true" 
> into toggle
>  repeat for each char thisChar in fileContents
>    if toggle = false then put thisChar after bank0 else put thisChar 
> after bank1
>    put not toggle into toggle
>  end repeat
>

I do have a fast computer (dual 1.25 GHz G4), but that time seems long. 
  I can process an over-10MB file in that time using script local bank0 
and bank1.  Are you sure that's where your bottleneck is?

In case you are wondering, yes, putting a char after a long string in a 
variable is efficient.

You can speed this up by changing 'toggle = false' to 'toggle' and 
swapping initial toggle state, but then only about 15%.

>> Tim, if this is a big-endian, little-endian problem in the big 
>> picture, please mention that.  I'm considering recommending that 
>> explicit byte order be added to binaryEncode and binaryDecode and 
>> would like to hear what you are doing to address this.  Also, you 
>> might find some help with these functions in handling binary files in 
>> any case.
>
>
> BINGO, Dar!  That's exactly what I'm trying to do.  16b as 
> 8b...big-endian, little-endian.  I haven't yet figured out how to 
> apply the binEncode/binDecode function to this.  Sure wish there was a 
> way...it would have to be faster than this.

Available is host byte order and network byte order.  Do you remember 
which way network order is?  Do you know know the order for your target 
computers?  And if network and host are the same, how do you get the 
other order?  I think the binaryEncode and binaryDecode functions are 
weak here.

They also can't do array or string accumulations for many data patterns 
such as even simple ones like yours.  Well, I don't know how, anyway.

These are very powerful functions and are important in binary 
manipulation, but your example illustrates two weaknesses.

Off the top of my head...  You might be interested in trying something 
like this:

function arrayFromFileImage @fileData
   local signedInt16, a
   repeat with i = 1 to length(fileData)/2
      put binaryDecode("n",char i+i-1 to i+i of fileData,signedInt16) 
into numConverted
      if numConverted is not 1 then exit repeat
      put unsignedInt into a[i]
   end repeat
   return a
end arrayFromFileImage

This will return an array of numbers from an interpretation of the file 
as signed 16-bit ints in network order.  I'll leave optimization and 
boundary review for another time/person.  And remember, that is just an 
untested guess.

I'm going to suggest an enhancement to binaryDecode() that will allow 
this to be done in one binaryDecode for either of your byte orders.  
However, there is no special reason to think either RunRev or MC will 
agree or, if they did, there is no special reason to think this would 
be available soon.

Dar Scott




More information about the use-livecode mailing list