В настоящее время я использую memcmp(...) == 0, чтобы определить, есть ли две памяти блоки равны. Хотя это работает, memcmp предназначен не только для проверки равенства, но и для определения порядка двух блоков памяти (больше, меньше или равно). Эта дополнительная функциональность может привести к ненужным накладным расходам.
Задача:
Мне нужно эффективно проверить, равны ли два блока памяти или нет.
Проблема:
Тот факт, что memcmp предоставляет информацию о порядке, означает, что она может быть менее эффективной, чем специально разработанная функция для проверки равенства.
Дополнительные издержки в memcmp связаны с необходимостью определения точного порядка блоков, если они не равны. Например, если memcmp возвращает ненулевой результат, это означает, что в каждом блоке памяти по некоторому индексу i есть два байта, которые отличаются определенным образом, и все предыдущие байты равны. Для этого memcmp должен проверить равенство всех предыдущих байтов, что требует времени. Напротив, функция, которая проверяет только равенство, может, например, немедленно проверить последние байты и, обнаружив разницу, прекратить проверку. Это может привести к амортизированному улучшению временной сложности.
Проще говоря: неэффективность memcmp связана с тем, что он ищет не просто разницу между блоками памяти, но есть ПЕРВОЕ отличие.
Что я пробовал:
Я написал свои собственные реализации чтобы продемонстрировать эту идею, и провел несколько тестов.
Код: Выделить всё
#include
#include
bool memcmp_memeq(const void* s1, const void* s2, size_t n) {
return memcmp(s1, s2, n) == 0;
}
bool my_memeq(const void* s1, const void* s2, size_t n) {
const static size_t simd_width = 16;
if (n
Подробнее здесь: [url]https://stackoverflow.com/questions/78693079/efficiently-check-for-equality-of-memory-blocks-in-c-c[/url]
Мобильная версия