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)
★★★

Ответ на: комментарий от mittorn

почему? сообщение парсится бустом целиком и там все уже стринги или инты, но сначала проверяется что это не жпег

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

но есть подозрение, что сделать какой то простой хеш было бы быстрее ) чем каждый раз сравнивать строки

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

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

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

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

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

Тем хуже, в 17 и 20 хотя бы полезности какие-то добавили, 14+boost - аццкая смесь

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

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

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

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

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

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

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

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

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

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

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

Хм. Ладно видимо такого нет, но в доке же написано, что топик у тебя в параметры колбека падает. Я бы лучше селект по топику делал чем по контенту угадывать.

ya-betmen ★★★★★
()

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

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

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

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

парсится бустом целиком

Лучше Glaze, но там аж C++23. :)

dataman ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.