Use faster/smaller versions for some string comparisons
authorMarek Safar <marek.safar@gmail.com>
Sat, 2 Mar 2013 15:39:17 +0000 (16:39 +0100)
committerMarek Safar <marek.safar@gmail.com>
Sat, 2 Mar 2013 17:56:31 +0000 (18:56 +0100)
mcs/class/corlib/System.IO/Path.cs
mcs/class/corlib/System.Reflection/Module.cs
mcs/class/corlib/System/Boolean.cs
mcs/class/corlib/System/Decimal.cs
mcs/class/corlib/System/Int32.cs
mcs/class/corlib/System/String.cs
mcs/class/corlib/System/Type.cs

index 57c33d3732bb2dfcd6b6759d079e835ca34f666a..22de37d7cf1acc9a2aee5624573bba4e69c2067a 100644 (file)
@@ -369,7 +369,7 @@ namespace System.IO {
                                        if (current [1] == VolumeSeparatorChar)
                                                path = current.Substring (0, 2) + path;
                                        else
-                                               path = current.Substring (0, current.IndexOf ('\\', current.IndexOf ("\\\\") + 1));
+                                               path = current.Substring (0, current.IndexOf ('\\', current.IndexOfOrdinalUnchecked ("\\\\") + 1));
                                }
                        }
                        
index a2bfae1dfbe6f031bf40c3812bd580f1be3454f1..d975403bd3ea070cf3e51c866c7097453adcfebc 100644 (file)
@@ -222,7 +222,7 @@ namespace System.Reflection {
                private static bool filter_by_type_name (Type m, object filterCriteria) {
                        string s = (string)filterCriteria;
                        if (s.Length > 0 && s [s.Length - 1] == '*')
-                               return m.Name.StartsWith (s.Substring (0, s.Length - 1), StringComparison.Ordinal);
+                               return m.Name.StartsWithOrdinalUnchecked (s.Substring (0, s.Length - 1));
                        
                        return m.Name == s;
                }
@@ -230,9 +230,9 @@ namespace System.Reflection {
                private static bool filter_by_type_name_ignore_case (Type m, object filterCriteria) {
                        string s = (string)filterCriteria;
                        if (s.Length > 0 && s [s.Length - 1] == '*')
-                               return m.Name.StartsWith (s.Substring (0, s.Length - 1), StringComparison.OrdinalIgnoreCase);
+                               return m.Name.StartsWithOrdinalCaseInsensitiveUnchecked (s.Substring (0, s.Length - 1));
                        
-                       return String.Equals (m.Name, s, StringComparison.OrdinalIgnoreCase);
+                       return string.CompareOrdinalCaseInsensitiveUnchecked (m.Name, s) == 0;
                }
 
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
index 841cacd3d4fac33b3c582fc5b1c1d63eeb379aab..712622b9a89ab35c14b6e006631c1cfe09e7b785 100644 (file)
@@ -170,10 +170,10 @@ namespace System
 
                        value = value.Trim ();
 
-                       if (string.CompareOrdinalCaseInsensitive (value, TrueString) == 0)
+                       if (string.CompareOrdinalCaseInsensitiveUnchecked (value, TrueString) == 0)
                                return true;
 
-                       if (string.CompareOrdinalCaseInsensitive (value, FalseString) == 0)
+                       if (string.CompareOrdinalCaseInsensitiveUnchecked (value, FalseString) == 0)
                                return false;
 
                        throw new FormatException (Locale.GetText (
@@ -188,12 +188,12 @@ namespace System
 
                        value = value.Trim ();
 
-                       if (string.CompareOrdinalCaseInsensitive (value, TrueString) == 0) {
+                       if (string.CompareOrdinalCaseInsensitiveUnchecked (value, TrueString) == 0) {
                                result = true;
                                return true;
                        }
 
-                       if (string.CompareOrdinalCaseInsensitive (value, FalseString) == 0) {
+                       if (string.CompareOrdinalCaseInsensitiveUnchecked (value, FalseString) == 0) {
                                // result = false; // already set at false by default
                                return true;
                        }
index e52205ac189d8865cd7c62651914c19490a746b1..5e08d69204b9bbb4e36c2b614dfb08fdc0183c59 100644 (file)
@@ -756,7 +756,7 @@ namespace System
                        bool hasCurrency = false;
                        if ((style & NumberStyles.AllowCurrencySymbol) != 0)
                        {
-                               int index = s.IndexOf (nfi.CurrencySymbol);
+                               int index = s.IndexOfOrdinalUnchecked (nfi.CurrencySymbol);
                                if (index >= 0) 
                                {
                                        s = s.Remove (index, nfi.CurrencySymbol.Length);
@@ -799,7 +799,7 @@ namespace System
                                else if (allowedLeadingSign && !string.IsNullOrEmpty (negativeSign) && ch == negativeSign[0] && !hasSign)
                                {
                                        int slen = negativeSign.Length;
-                                       if (slen == 1 || s.IndexOf (negativeSign, pos, slen) == pos)
+                                       if (slen == 1 || s.IndexOfOrdinalUnchecked (negativeSign, pos, slen) == pos)
                                        {
                                                hasSign = true;
                                                isNegative = true;
@@ -809,7 +809,7 @@ namespace System
                                else if (allowedLeadingSign && !string.IsNullOrEmpty (positiveSign) && ch == positiveSign[0] && !hasSign)
                                {
                                        int slen = positiveSign.Length;
-                                       if (slen == 1 || s.IndexOf (positiveSign, pos, slen) == pos)
+                                       if (slen == 1 || s.IndexOfOrdinalUnchecked (positiveSign, pos, slen) == pos)
                                        {
                                                hasSign = true;
                                                pos += slen;
@@ -818,7 +818,7 @@ namespace System
                                else if (allowedDecimalPoint && ch == decimalSep[0])
                                {
                                        int slen = decimalSep.Length;
-                                       if (slen != 1 && s.IndexOf (decimalSep, pos, slen) != pos) 
+                                       if (slen != 1 && s.IndexOfOrdinalUnchecked (decimalSep, pos, slen) != pos) 
                                        {
                                                if (throwex)
                                                        ThrowAtPos (pos);
@@ -855,7 +855,7 @@ namespace System
                                else if (allowedThousands && ch == groupSep[0] && ch != decimalSep [0]) 
                                {
                                        int slen = groupSep.Length;
-                                       if (slen != 1 && s.IndexOf(groupSep, pos, slen) != pos) 
+                                       if (slen != 1 && s.IndexOfOrdinalUnchecked(groupSep, pos, slen) != pos) 
                                        {
                                                if (throwex)
                                                        ThrowAtPos (pos);
@@ -867,7 +867,7 @@ namespace System
                                else if (allowedDecimalPoint && ch == decimalSep[0] && !hasDecimalPoint)
                                {
                                        int slen = decimalSep.Length;
-                                       if (slen == 1 || s.IndexOf(decimalSep, pos, slen) == pos) 
+                                       if (slen == 1 || s.IndexOfOrdinalUnchecked(decimalSep, pos, slen) == pos) 
                                        {
                                                decPos = sb.Length;
                                                hasDecimalPoint = true;
@@ -899,7 +899,7 @@ namespace System
                                        if (!string.IsNullOrEmpty (positiveSign) && ch == positiveSign[0])
                                        {
                                                int slen = positiveSign.Length;
-                                               if (slen == 1 || s.IndexOf (positiveSign, pos, slen) == pos)
+                                               if (slen == 1 || s.IndexOfOrdinalUnchecked (positiveSign, pos, slen) == pos)
                                                {
                                                        pos += slen;
                                                        if (pos >= len) {
@@ -913,7 +913,7 @@ namespace System
                                        else if (!string.IsNullOrEmpty (negativeSign) && ch == negativeSign[0])
                                        {
                                                int slen = negativeSign.Length;
-                                               if (slen == 1 || s.IndexOf (negativeSign, pos, slen) == pos)
+                                               if (slen == 1 || s.IndexOfOrdinalUnchecked (negativeSign, pos, slen) == pos)
                                                {
                                                        pos += slen;
                                                        if (pos >= len) {
@@ -961,7 +961,7 @@ namespace System
                                else if (allowedTrailingSign && !string.IsNullOrWhiteSpace (negativeSign) && ch == negativeSign[0] && !hasSign)
                                {
                                        int slen = negativeSign.Length;
-                                       if (slen == 1 || s.IndexOf(negativeSign, pos, slen) == pos)
+                                       if (slen == 1 || s.IndexOfOrdinalUnchecked(negativeSign, pos, slen) == pos)
                                        {
                                                hasSign = true;
                                                isNegative = true;
@@ -971,7 +971,7 @@ namespace System
                                else if (allowedTrailingSign && !string.IsNullOrWhiteSpace (positiveSign) && ch == positiveSign[0] && !hasSign)
                                {
                                        int slen = positiveSign.Length;
-                                       if (slen == 1 || s.IndexOf (positiveSign, pos, slen) == pos)
+                                       if (slen == 1 || s.IndexOfOrdinalUnchecked (positiveSign, pos, slen) == pos)
                                        {
                                                hasSign = true;
                                                pos += slen;
index 13e1e5270db545a275c9b5f4f777e049bfc8edfd..1371f78c9c262ee2bc35fc9dde4036f17df63234 100644 (file)
@@ -251,12 +251,12 @@ namespace System {
                                      ref bool foundSign, ref bool negative)
                {
                        if ((pos + nfi.NegativeSign.Length) <= s.Length &&
-                               s.IndexOf (nfi.NegativeSign, pos, nfi.NegativeSign.Length) == pos) {
+                               s.IndexOfOrdinalUnchecked (nfi.NegativeSign, pos, nfi.NegativeSign.Length) == pos) {
                                negative = true;
                                foundSign = true;
                                pos += nfi.NegativeSign.Length;
                        } else if ((pos + nfi.PositiveSign.Length) <= s.Length &&
-                               s.IndexOf (nfi.PositiveSign, pos, nfi.PositiveSign.Length) == pos) {
+                               s.IndexOfOrdinalUnchecked (nfi.PositiveSign, pos, nfi.PositiveSign.Length) == pos) {
                                negative = false;
                                pos += nfi.PositiveSign.Length;
                                foundSign = true;
index 50052a0f5e25ebd68b386d8484d2c3cf4070a244..937b9214582ab5fdb3638cbe1c8a80dd9a31b47d 100644 (file)
@@ -828,7 +828,7 @@ namespace System
                //
                // Fastest method for internal case insensitive comparison
                //
-               internal static int CompareOrdinalCaseInsensitive (string strA, string strB)
+               internal static int CompareOrdinalCaseInsensitiveUnchecked (string strA, string strB)
                {
                        return CompareOrdinalCaseInsensitiveUnchecked (strA, 0, int.MaxValue, strB, 0, int.MaxValue);
                }
@@ -1014,6 +1014,11 @@ namespace System
                        return IndexOfOrdinalIgnoreCaseUnchecked (value, startIndex, count);
                }
 
+               internal unsafe int IndexOfOrdinalUnchecked (string value)
+               {
+                       return IndexOfOrdinalUnchecked (value, 0, length);
+               }
+
                internal unsafe int IndexOfOrdinalUnchecked (string value, int startIndex, int count)
                {
                        int valueLen = value.Length;
@@ -1651,15 +1656,25 @@ namespace System
                        case StringComparison.InvariantCultureIgnoreCase:
                                return CultureInfo.InvariantCulture.CompareInfo.IsPrefix (this, value, CompareOptions.IgnoreCase);
                        case StringComparison.Ordinal:
-                               return CultureInfo.CurrentCulture.CompareInfo.IsPrefix (this, value, CompareOptions.Ordinal);
+                               return StartsWithOrdinalUnchecked (value);
                        case StringComparison.OrdinalIgnoreCase:
-                               return CultureInfo.CurrentCulture.CompareInfo.IsPrefix (this, value, CompareOptions.OrdinalIgnoreCase);
+                               return StartsWithOrdinalCaseInsensitiveUnchecked (value);
                        default:
                                string msg = Locale.GetText ("Invalid value '{0}' for StringComparison", comparisonType);
                                throw new ArgumentException (msg, "comparisonType");
                        }
                }
 
+               internal bool StartsWithOrdinalUnchecked (string value)
+               {
+                       return length >= value.length && CompareOrdinalUnchecked (this, 0, value.length, value, 0, value.length) == 0;
+               }
+
+               internal bool StartsWithOrdinalCaseInsensitiveUnchecked (string value)
+               {
+                       return length >= value.Length && CompareOrdinalCaseInsensitiveUnchecked (this, 0, value.length, value, 0, value.length) == 0;
+               }
+
                [ComVisible (false)]
                public bool EndsWith (string value, StringComparison comparisonType)
                {
index 90d39b20b30fe828bd14a1f79726025e5b2f0b4e..64509fead65f2867479876af345b278d4d52ac1b 100644 (file)
@@ -75,7 +75,7 @@ namespace System {
                                return false; // because m.Name cannot be null or empty
                        
                        if (name [name.Length - 1] == '*')
-                               return m.Name.StartsWith (name.Substring (0, name.Length - 1), StringComparison.Ordinal);
+                               return m.Name.StartsWithOrdinalUnchecked (name.Substring (0, name.Length - 1));
                        
                        return m.Name == name;
                }
@@ -87,9 +87,9 @@ namespace System {
                                return false; // because m.Name cannot be null or empty
                                
                        if (name [name.Length - 1] == '*')
-                               return m.Name.StartsWith (name.Substring (0, name.Length - 1), StringComparison.OrdinalIgnoreCase);
+                               return m.Name.StartsWithOrdinalCaseInsensitiveUnchecked (name.Substring (0, name.Length - 1));
                        
-                       return string.Equals (m.Name, name, StringComparison.OrdinalIgnoreCase);
+                       return string.CompareOrdinalCaseInsensitiveUnchecked (m.Name, name) == 0;
                }
 
                static bool FilterAttribute_impl (MemberInfo m, object filterCriteria)