Я должен сравнить на равенство 16 байт блоков памяти в очень чувствительном к производительности месте.
Блоки всегда идеально выровнены, и они всегда точно 16 байтов. Мне кажется, что я должен быть в состоянии использовать эти знания и придумать что-то, что работает лучше, чем побайтовое сравнение.
На самом деле я полагаю, что большинство реализаций memcmp делают это, но, очевидно, потребуется некоторое время, чтобы проанализировать адреса и размер. В моем случае это не так, и все же это еще быстрее:
...
mov $0x10,%ecx
mov -0x4c(%ebp),%esi
repz cmpsb %es:(%edi),%ds:(%esi)
Я попытался оптимизировать его с помощью реализации 32-битных проверок самостоятельно, но он не работает лучше. Возможно, потому что memcmp использует инструкции процессора, а мой пользовательский код на C ++ — нет.
Есть идеи, есть ли что-то быстрее, чем memcmp для такого случая?
Вы можете попробовать что-то вроде этого, просто чтобы увидеть, что это изменит по сравнению с memcmp (при условии, что у вас 64-битный процессор):
#define MY_CMP(B1, B2) (((int64_t *) (B1))[0] == (int64_t *) (B2))[0] && ((int64_t *) (B1))[1] == ((int64_t *) (B2))[1])
if (MY_CMP(array1, array2)) {
// something
}
Но если компилятор хорош, вы не увидите никакой разницы.