Sie werden immer eine Schleife benötigen. Aber Sie könnten Benchmarks durchführen, wenn das Schleifen um 4 Byte (in Int * umgewandelt) oder um 8 Byte (uint64_t
oder long long int
) schneller ist als die naive Lösung pro Byte.
Noch besser, abhängig von der Länge (sagen wir> 1kb) könnten Sie die Schleife ausrollen, was bedeutet, dass Sie z. pro 8 int/uint64_t und bei einer Nichtübereinstimmung das erste abweichende Byte lokalisieren.
uint64_t *bigsteps1 = (uint64_t*)m1;
uint64_t *bigsteps2 = (uint64_t*)m2;
int steps = min(m1_len,m2_len)/sizeof(uint64_t);
int i;
for (i=0; i<steps; i+=8)
{
if (bigsteps1[i] != bigsteps2[i]
|| bigsteps1[i+1] != bigsteps2[i+1]
/// ....
|| bigsteps1[i+7] != bigsteps2[i+7]) break;
}
// i<steps tells if we found a difference
// end game is trivial, left as an excercise to the reader.
Die Schleife entrollen kann auch nach hinten losgehen, denn Sie haben alle diese + N Dinge drin und die i + = 8 als auch. Benchmark um sicher zu sein.
ps überprüfen auch Speicherausrichtung: dies, wenn schnellste sein wird m1&0xff == m2&0xff == 0
siehe auch http://stackoverflow.com/questions/855895/intrinsic-memcmp über per-cpu optimierte memcmp-Implementierungen. Wenn Sie die CPU kennen, können Sie eine der gcc __builtin_memcmp() Funktionen auf Ihre Bedürfnisse abstimmen. – mvds
Beachten Sie, dass alles, was Sie hier haben, als Schleife * irgendwo * implementiert wird - es gibt keinen magischen Weg, um das zu tun, was Sie hier ohne einen wollen. –