[infinispan-dev] writeUnsignedInt() inefficient with bytes between 128 and 255

Galder Zamarreno galder.zamarreno at redhat.com
Thu Sep 3 07:29:22 EDT 2009


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.

>
> 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