You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by te...@apache.org on 2009/05/05 15:26:44 UTC
svn commit: r771716 - in
/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java:
lang/Double.java lang/Float.java util/Arrays.java
Author: tellison
Date: Tue May 5 13:26:43 2009
New Revision: 771716
URL: http://svn.apache.org/viewvc?rev=771716&view=rev
Log:
Improvement to Float/Double comparison performance.
Modified:
harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/lang/Double.java
harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/lang/Float.java
harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/Arrays.java
Modified: harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/lang/Double.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/lang/Double.java?rev=771716&r1=771715&r2=771716&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/lang/Double.java (original)
+++ harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/lang/Double.java Tue May 5 13:26:43 2009
@@ -126,25 +126,7 @@
* @since 1.2
*/
public int compareTo(Double object) {
- long d1, d2;
- long NaNbits = Double.doubleToLongBits(Double.NaN);
- if ((d1 = Double.doubleToLongBits(value)) == NaNbits) {
- if (Double.doubleToLongBits(object.value) == NaNbits) {
- return 0;
- }
- return 1;
- }
- if ((d2 = Double.doubleToLongBits(object.value)) == NaNbits) {
- return -1;
- }
- if (value == object.value) {
- if (d1 == d2) {
- return 0;
- }
- // check for -0
- return d1 > d2 ? 1 : -1;
- }
- return value > object.value ? 1 : -1;
+ return compare(value, object.value);
}
@Override
@@ -359,25 +341,35 @@
* value if {@code double1} is greater than {@code double2}.
*/
public static int compare(double double1, double double2) {
- long d1, d2;
- long NaNbits = Double.doubleToLongBits(Double.NaN);
- if ((d1 = Double.doubleToLongBits(double1)) == NaNbits) {
- if (Double.doubleToLongBits(double2) == NaNbits) {
- return 0;
- }
+ // Non-zero, non-NaN checking.
+ if (double1 > double2) {
return 1;
}
- if ((d2 = Double.doubleToLongBits(double2)) == NaNbits) {
+ if (double2 > double1) {
return -1;
}
- if (double1 == double2) {
- if (d1 == d2) {
+ if (double1 == double2 && 0.0d != double1) {
+ return 0;
+ }
+
+ // NaNs are equal to other NaNs and larger than any other float
+ if (isNaN(double1)) {
+ if (isNaN(double2)) {
return 0;
}
- // check for -0
- return d1 > d2 ? 1 : -1;
+ return 1;
+ } else if (isNaN(double2)) {
+ return -1;
+ }
+
+ // Deal with +0.0 and -0.0
+ long d1 = doubleToRawLongBits(double1);
+ long d2 = doubleToRawLongBits(double2);
+
+ if (d1 == d2) {
+ return 0;
}
- return double1 > double2 ? 1 : -1;
+ return (d1 < d2) ? -1 : 1;
}
/**
Modified: harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/lang/Float.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/lang/Float.java?rev=771716&r1=771715&r2=771716&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/lang/Float.java (original)
+++ harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/lang/Float.java Tue May 5 13:26:43 2009
@@ -130,25 +130,7 @@
* @since 1.2
*/
public int compareTo(Float object) {
- int f1, f2;
- int NaNbits = Float.floatToIntBits(Float.NaN);
- if ((f1 = Float.floatToIntBits(value)) == NaNbits) {
- if (Float.floatToIntBits(object.value) == NaNbits) {
- return 0;
- }
- return 1;
- }
- if ((f2 = Float.floatToIntBits(object.value)) == NaNbits) {
- return -1;
- }
- if (value == object.value) {
- if (f1 == f2) {
- return 0;
- }
- // check for -0
- return f1 > f2 ? 1 : -1;
- }
- return value > object.value ? 1 : -1;
+ return compare(value, object.value);
}
@Override
@@ -363,25 +345,35 @@
* @since 1.4
*/
public static int compare(float float1, float float2) {
- int f1, f2;
- int NaNbits = Float.floatToIntBits(Float.NaN);
- if ((f1 = Float.floatToIntBits(float1)) == NaNbits) {
- if (Float.floatToIntBits(float2) == NaNbits) {
- return 0;
- }
+ // Non-zero, non-NaN checking.
+ if (float1 > float2) {
return 1;
}
- if ((f2 = Float.floatToIntBits(float2)) == NaNbits) {
+ if (float2 > float1) {
return -1;
}
- if (float1 == float2) {
- if (f1 == f2) {
+ if (float1 == float2 && 0.0f != float1) {
+ return 0;
+ }
+
+ // NaNs are equal to other NaNs and larger than any other float
+ if (isNaN(float1)) {
+ if (isNaN(float2)) {
return 0;
}
- // check for -0
- return f1 > f2 ? 1 : -1;
+ return 1;
+ } else if (isNaN(float2)) {
+ return -1;
+ }
+
+ // Deal with +0.0 and -0.0
+ int f1 = floatToRawIntBits(float1);
+ int f2 = floatToRawIntBits(float2);
+
+ if (f1 == f2) {
+ return 0;
}
- return float1 > float2 ? 1 : -1;
+ return (f1 < f2) ? -1 : 1;
}
/**
Modified: harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/Arrays.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/Arrays.java?rev=771716&r1=771715&r2=771716&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/Arrays.java (original)
+++ harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/Arrays.java Tue May 5 13:26:43 2009
@@ -1530,41 +1530,11 @@
}
private static boolean lessThan(double double1, double double2) {
- long d1, d2;
- long NaNbits = Double.doubleToLongBits(Double.NaN);
- if ((d1 = Double.doubleToLongBits(double1)) == NaNbits) {
- return false;
- }
- if ((d2 = Double.doubleToLongBits(double2)) == NaNbits) {
- return true;
- }
- if (double1 == double2) {
- if (d1 == d2) {
- return false;
- }
- // check for -0
- return d1 < d2;
- }
- return double1 < double2;
+ return Double.compare(double1, double2) < 0;
}
private static boolean lessThan(float float1, float float2) {
- int f1, f2;
- int NaNbits = Float.floatToIntBits(Float.NaN);
- if ((f1 = Float.floatToIntBits(float1)) == NaNbits) {
- return false;
- }
- if ((f2 = Float.floatToIntBits(float2)) == NaNbits) {
- return true;
- }
- if (float1 == float2) {
- if (f1 == f2) {
- return false;
- }
- // check for -0
- return f1 < f2;
- }
- return float1 < float2;
+ return Float.compare(float1, float2) < 0;
}
private static int med3(byte[] array, int a, int b, int c) {