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