Skip to content

Commit

Permalink
Merge pull request dotnet#1063 from bbowyersmyth/StringEquals
Browse files Browse the repository at this point in the history
Improve String.Equals loop body performance
  • Loading branch information
jkotas committed Mar 28, 2016
2 parents 07ad288 + fa6da30 commit 332d6cc
Showing 1 changed file with 16 additions and 20 deletions.
36 changes: 16 additions & 20 deletions src/System.Private.CoreLib/src/System/String.cs
Original file line number Diff line number Diff line change
Expand Up @@ -699,19 +699,19 @@ private unsafe static bool OrdinalCompareEqualLengthStrings(String strA, String

while (length >= 12)
{
if (*(long*)a != *(long*)b) return false;
if (*(long*)(a + 4) != *(long*)(b + 4)) return false;
if (*(long*)(a + 8) != *(long*)(b + 8)) return false;
if (*(long*)a != *(long*)b) goto ReturnFalse;
if (*(long*)(a + 4) != *(long*)(b + 4)) goto ReturnFalse;
if (*(long*)(a + 8) != *(long*)(b + 8)) goto ReturnFalse;
length -= 12; a += 12; b += 12;
}
#else
while (length >= 10)
{
if (*(int*)a != *(int*)b) return false;
if (*(int*)(a + 2) != *(int*)(b + 2)) return false;
if (*(int*)(a + 4) != *(int*)(b + 4)) return false;
if (*(int*)(a + 6) != *(int*)(b + 6)) return false;
if (*(int*)(a + 8) != *(int*)(b + 8)) return false;
if (*(int*)a != *(int*)b) goto ReturnFalse;
if (*(int*)(a + 2) != *(int*)(b + 2)) goto ReturnFalse;
if (*(int*)(a + 4) != *(int*)(b + 4)) goto ReturnFalse;
if (*(int*)(a + 6) != *(int*)(b + 6)) goto ReturnFalse;
if (*(int*)(a + 8) != *(int*)(b + 8)) goto ReturnFalse;
length -= 10; a += 10; b += 10;
}
#endif
Expand All @@ -722,11 +722,14 @@ private unsafe static bool OrdinalCompareEqualLengthStrings(String strA, String
// the zero terminator.
while (length > 0)
{
if (*(int*)a != *(int*)b) break;
if (*(int*)a != *(int*)b) goto ReturnFalse;
length -= 2; a += 2; b += 2;
}

return (length <= 0);
return true;

ReturnFalse:
return false;
}
}

Expand Down Expand Up @@ -965,14 +968,11 @@ public static bool Equals(String a, String b)
return true;
}

if ((Object)a == null || (Object)b == null)
if ((Object)a == null || (Object)b == null || a.Length != b.Length)
{
return false;
}

if (a.Length != b.Length)
return false;

return OrdinalCompareEqualLengthStrings(a, b);
}

Expand Down Expand Up @@ -1020,9 +1020,7 @@ public static bool Equals(String a, String b, StringComparison comparisonType)
{
if (Object.ReferenceEquals(a, b))
return true;
if (a == null || b == null)
return false;
if (a.Length != b.Length)
if (a == null || b == null || a.Length != b.Length)
return false;
return OrdinalCompareEqualLengthStrings(a, b);
}
Expand All @@ -1031,9 +1029,7 @@ public static bool Equals(String a, String b, StringComparison comparisonType)
{
if (Object.ReferenceEquals(a, b))
return false;
if (a == null || b == null)
return true;
if (a.Length != b.Length)
if (a == null || b == null || a.Length != b.Length)
return true;
return !OrdinalCompareEqualLengthStrings(a, b);
}
Expand Down

0 comments on commit 332d6cc

Please sign in to comment.