String compare in words?
qznc via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sun May 29 13:40:52 PDT 2016
On Sunday, 29 May 2016 at 18:15:16 UTC, qznc wrote:
> On Sunday, 29 May 2016 at 17:38:17 UTC, Jonathan M Davis wrote:
>> And if you're not simply comparing for equality, what are you
>> looking to figure out? Without more information about what
>> you're trying to do, it's kind of hard to help you.
>
> If I write the comparison naively, the assembly clearly shows a
> "movzbl" [0]. It loads a single byte! The other single byte
> load is encoded in the address mode of "cmp". Implementation:
>
> bool stringcmp(string x, string y) {
> foreach(i; 0..x.length) {
> if (x[i] != y[i]) // byte compare
> return false;
> }
> return true;
> }
>
> It makes no sense to load single bytes here. Since we only want
> to check for equality, we could load two full words and compare
> four or eight bytes in one go.
Ok, to answer my own question, this looks good:
bool string_cmp_opt(immutable(ubyte)[] x, immutable(ubyte)[] y) {
pragma(inline, false);
if (x.length != y.length) return false;
int i=0;
// word-wise compare is faster than byte-wise
if (x.length > size_t.sizeof)
for (; i < x.length - size_t.sizeof; i+=size_t.sizeof) {
size_t* xw = cast(size_t*) &x[i];
size_t* yw = cast(size_t*) &x[i];
if (*xw != *yw) return false;
}
// last sub-word part
for (; i < x.length; i+=1) {
if (x[i] != y[i]) // byte compare
return false;
}
return true;
}
Any comments or recommendations?
More information about the Digitalmars-d-learn
mailing list