LINUX.ORG.RU

memcmp вместо strncmp для оптимизации?

 , , memcmp, strncmp


0

2

Приветствую.

Построено у меня взаимодействие с тысячами железок через mqtt сервер, из всего многообразия «сообщений» приходящих через либу в типе char * msg есть пересылка снимков в jpeg, которые тоже приходят одномоментно тысячами штук на свой сервис, весь «парсинг заголовка сообщения» на этом сервисе выполнял обычным strncmp и для жпега это выглядит как

if (!strncmp(msg, "\xFF\xD8\xFF", 3)) { ... }
else if ...

как я понимаю memcmp быстрее strncmp, тем более мне нужно сравнить байты а не строки и понятно что так тоже как минимум компилируется

if (!memcmp(msg, "\xFF\xD8\xFF", 3)) { ... }

а можно БЕЗ объявления переменной выполнять сравнение набора байт любой длины?

мне такой в голову пришел перл, но что то сомнительна его производительность )

if (memcmp(msg, std::array<uint8_t,3>({0xFF, 0xD8, 0xFF}).data(), 3) == 0)
★★★
Ответ на: комментарий от wolverin

Да, быстрее. В зависимости от процента поступающих жпегов можно обойтись очень тупым хэшем с коллизиями и потом проверять, либо делать красивый хэш и доверять ему как есть.

Bfgeshka ★★★★★
()
Ответ на: комментарий от MKuznetsov

в принципе это идея - все месаги закодировать 2 байтами (хотя пока по количеству их видов и за 1 байт не выхожу) в начале и уже по ним выполнять switch

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 2)
Ответ на: комментарий от wolverin

ну причем тут разнос по топикам - т.е. топики сравнивать быстрее чем просто посмотреть о чем месага!?

в общем как принято: в топиках должны быть однотипные данные. Если топик про температуру, так там и должна быть температура а не фотка термометра. Назначение и типы данных не должны путаться.

чтобы mqtt автосредствами конвертировался в базы и другие протоколы. Например телеграфом лить измерения в базу.

и да, с топиками быстрее - ты всё равно так или иначе их смотришь и разбираешь.

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

ты всё равно так или иначе их смотришь и разбираешь

сервис слушает почти все, поэтому разбирать конкретно ему разные топики никакого смысла нет.

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 1)
Ответ на: комментарий от MKuznetsov

единственный смысл разбирать топики, это именно их кодировать в байты, а не в самих сообщениях, тогда да можно условно последний 1-2 байта названия топика проверять.

wolverin ★★★
() автор топика

Используй строковый литерал и расслабься. memcmp вообще может инлайнится и превратится в какой нибудь cmp для случая 3 байт, без хранения строки в rodata. Чем меньше лишних сущностей в коде, тем проще его оптимизировать.

KivApple ★★★★★
()
Ответ на: комментарий от ya-betmen

контент разный даже в одном топике, ну не городить же 100500 топиков под однотипный контент, поэтому сравнивать ДВАЖДЫ придется, вот сейчас признак контента добавил перед сообщением и в итоге насчиталось 20 штук уже, но будут еще.

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 1)
Ответ на: комментарий от anonymous

Компилятор заменил вызов strncmp на команду сравнения с константой

Ну и почему это минусят? Это реально так - если длина строки известна на этапе компиляции, то вызова функции не будет, будет подставлена константа, и с ней проведено сравнение.

Очень хороший способ оптимизации, если вызов memcmp действительно узкое место.

blex ★★★
()