[ 
http://issues.apache.org/jira/browse/LUCENE-467?page=comments#action_12357851 ] 

Yonik Seeley commented on LUCENE-467:
-------------------------------------

Fun with premature optimization!
I know this isn't a bottleneck, but here is the fastest floatToByte() that I 
could come up with:

  public static byte floatToByte(float f) {
    int bits = Float.floatToRawIntBits(f);
    if (bits<=0) return 0;
    int mantissa = (bits & 0xffffff) >> 21;
    int exponent = (bits >>> 24) - 63 + 15;
    if ((exponent & ~0x1f)==0) return (byte)((exponent << 3) | mantissa);
    else if (exponent<0) return 1;
    return -1;
  }

Here is the original from Lucene for reference:

  public static byte floatToByte(float f) {
    if (f < 0.0f)                                 // round negatives up to zero
      f = 0.0f;

    if (f == 0.0f)                                // zero is a special case
      return 0;

    int bits = Float.floatToIntBits(f);           // parse float into parts
    int mantissa = (bits & 0xffffff) >> 21;
    int exponent = (((bits >> 24) & 0x7f) - 63) + 15;
    if (exponent > 31) {                          // overflow: use max value
      exponent = 31;
      mantissa = 7;
    }

    if (exponent < 0) {                           // underflow: use min value
      exponent = 0;
      mantissa = 1;
    }

    return (byte)((exponent << 3) | mantissa);    // pack into a byte
   }


Here is the performance (in seconds) on my P4 to do 640M conversions:

              JDK14-server  JDK14-client  JDK15-server  JDK15-client  
JDK16-server  JDK16-client
orig       75.422               89.451            8.344                 57.631  
          7.656                 57.984
new      67.265               78.891            5.906                 22.172    
        5.172                 18.750
diff        12%                    13%                41%                   
160%              48%                   209%

Some decent gains... but the biggest moral of the story is: use Java>=1.5 and 
-server if you can!



> Use Float.floatToRawIntBits over Float.floatToIntBits
> -----------------------------------------------------
>
>          Key: LUCENE-467
>          URL: http://issues.apache.org/jira/browse/LUCENE-467
>      Project: Lucene - Java
>         Type: Improvement
>   Components: Other
>     Versions: 1.9
>     Reporter: Yonik Seeley
>     Priority: Minor

>
> Copied From my Email:
>   Float.floatToRawIntBits (in Java1.4) gives the raw float bits without
> normalization (like *(int*)&floatvar would in C).  Since it doesn't do
> normalization of NaN values, it's faster (and hopefully optimized to a
> simple inline machine instruction by the JVM).
> On my Pentium4, using floatToRawIntBits is over 5 times as fast as
> floatToIntBits.
> That can really add up in something like Similarity.floatToByte() for
> encoding norms, especially if used as a way to compress an array of
> float during query time as suggested by Doug.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to