Вам всегда понадобится петля.Но вы могли бы сделать бенчмарк, если цикл на 4 байта (приведение к int *) или на 8 байтов (uint64_t
или long long int
) выполняется быстрее, чем простое на байтовое решение.
Еще лучше, в зависимости отдлина (скажем,> 1 КБ) вы можете развернуть цикл, то есть вы проверяете, например, на 8 int / uint64_t и при несоответствии точно определяете первый отличающийся байт.
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.
Развертывание цикла также может иметь неприятные последствиятам есть все эти + N вещей, а также i + = 8.Эталонный тест, чтобы быть уверенным.
ps также проверьте выравнивание памяти: это будет самым быстрым, когда m1&0xff == m2&0xff == 0