mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: Implement faster equals for strings and bytes.
(amd64) benchmark old ns/op new ns/op delta BenchmarkEqual0 16 6 -63.15% BenchmarkEqual9 22 7 -65.37% BenchmarkEqual32 36 9 -74.91% BenchmarkEqual4K 2187 120 -94.51% benchmark old MB/s new MB/s speedup BenchmarkEqual9 392.22 1134.38 2.89x BenchmarkEqual32 866.72 3457.39 3.99x BenchmarkEqual4K 1872.73 33998.87 18.15x (386) benchmark old ns/op new ns/op delta BenchmarkEqual0 16 5 -63.85% BenchmarkEqual9 22 7 -67.84% BenchmarkEqual32 34 12 -64.94% BenchmarkEqual4K 2196 113 -94.85% benchmark old MB/s new MB/s speedup BenchmarkEqual9 405.81 1260.18 3.11x BenchmarkEqual32 919.55 2631.21 2.86x BenchmarkEqual4K 1864.85 36072.54 19.34x Update #3751 R=bradfitz, r, khr, dave, remyoudompheng, fullung, minux.ma, ality CC=golang-dev https://golang.org/cl/8056043
This commit is contained in:
parent
6ca1fa625c
commit
3d5daa2319
14 changed files with 416 additions and 62 deletions
|
|
@ -37,25 +37,11 @@ runtime·memhash(uintptr *h, uintptr s, void *a)
|
|||
void
|
||||
runtime·memequal(bool *eq, uintptr s, void *a, void *b)
|
||||
{
|
||||
byte *ba, *bb, *aend;
|
||||
|
||||
if(a == b) {
|
||||
*eq = 1;
|
||||
return;
|
||||
}
|
||||
ba = a;
|
||||
bb = b;
|
||||
aend = ba+s;
|
||||
while(ba != aend) {
|
||||
if(*ba != *bb) {
|
||||
*eq = 0;
|
||||
return;
|
||||
}
|
||||
ba++;
|
||||
bb++;
|
||||
}
|
||||
*eq = 1;
|
||||
return;
|
||||
*eq = runtime·memeq(a, b, s);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -323,6 +309,7 @@ void
|
|||
runtime·strequal(bool *eq, uintptr s, void *a, void *b)
|
||||
{
|
||||
intgo alen;
|
||||
byte *s1, *s2;
|
||||
|
||||
USED(s);
|
||||
alen = ((String*)a)->len;
|
||||
|
|
@ -330,11 +317,13 @@ runtime·strequal(bool *eq, uintptr s, void *a, void *b)
|
|||
*eq = false;
|
||||
return;
|
||||
}
|
||||
if(((String*)a)->str == ((String*)b)->str) {
|
||||
s1 = ((String*)a)->str;
|
||||
s2 = ((String*)b)->str;
|
||||
if(s1 == s2) {
|
||||
*eq = true;
|
||||
return;
|
||||
}
|
||||
runtime·memequal(eq, alen, ((String*)a)->str, ((String*)b)->str);
|
||||
*eq = runtime·memeq(s1, s2, alen);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue