[infinispan-dev] writeUnsignedInt() inefficient with bytes between 128 and 255
Galder Zamarreno
galder.zamarreno at redhat.com
Thu Sep 3 07:48:23 EDT 2009
On 09/03/2009 01:29 PM, Galder Zamarreno wrote:
> On 09/03/2009 12:53 PM, Galder Zamarreno wrote:
>> Hi,
>>
>> While looking at https://jira.jboss.org/jira/browse/ISPN-149, I've
>> realised that writeUnsignedInt(), due to its dynamic behaivour, it's
>> more efficient than using a leading byte and then writing a byte, short
>> or int.
>>
>> However, I've spotted an unefficiency in
>> UnsignedNumeric.writeUnsignedInt() which is that if you write a byte
>> that's between 128-255, it writes two bytes, whereas in theory, you
>> could just write it as a single unsigned byte.
>>
>> Now, I'm not an expert on these methods, but I believe a
>> writeUnsignedInt like this would make 128-255 bytes be written as 1 byte
>> too:
>>
>> public static void writeUnsignedInt(ObjectOutput out, int i) throws
>> IOException {
>> while ((i& ~0xFF) != 0) {
>> out.writeByte((byte) ((i& 0xFF) | 0x100));
>> i>>>= 8;
>> }
>> out.writeByte((byte) i);
>> }
>>
>> And the read part would look like:
>>
>> public static int readUnsignedInt(ObjectInput in) throws IOException {
>> int b = in.readUnsignedByte();
>> int i = b& 0xFF;
>> for (int shift = 8; (b& 0x100) != 0; shift += 8) {
>> b = in.readUnsignedByte();
>> i |= (b& 0xFFL)<< shift;
>> }
>> return i;
>> }
>
> Hmmm, the read part is not working as expected. Trying to figure out how
> to get on values equal or bigger than 256 to read the next byte.
Hmmm, this is trickier than I thought. In the current solution, you know
you have to read more bytes cos the byte you've just read is negative.
However, if you use the full 4 bytes, how do you know that you need to
read another byte? Hmmmm....
>
>> Manik, I think you created these methods in the 1st place, thoughts?
>> CC'ing David M L who's quite an expert on this too.
>>
>> Cheers,
>
--
Galder Zamarreño
Sr. Software Engineer
Infinispan, JBoss Cache
More information about the infinispan-dev
mailing list