реклама на сайте
подробности

 
 
> отследить изменение переменной.
Jenya7
сообщение Dec 15 2015, 10:14
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



есть пакет с данными uint8_t packet[20] . переменная uint32_t занимает 4 байта. соответственно если я хочу посмотреть изменилась ли переменная в следующей посылке я могу сделать так
Код
if (new_packet[0] != old_packet[0] || new_packet[1] != old_packet[1] || new_packet[2] != old_packet[2] || new_packet[3] != old_packet[3])

или так
Код
if(memcmp(new_packet, old_packet, 4) != 0)

вопрос какой способ быстрее?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
XVR
сообщение Dec 16 2015, 11:09
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
if(*((uint32_t*)&new_packet[4]) != *((uint32_t*)&old_packet[4])) рулит. в принципе это частный случай более общего - ((my_struct *) my_arr)->value_32bit
На ARM этот 'частный случай' даст hard fault если адрес new_packet или old_packet не будет кратен 4, а так да, оно рулит sm.gif

Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 16 2015, 11:18
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (XVR @ Dec 16 2015, 13:09) *
На ARM этот 'частный случай' даст hard fault...

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Dec 16 2015, 15:00
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(zltigo @ Dec 16 2015, 11:18) *
Не обязательно fault - чаще фигню взятую по выровненному адресу молча возвратит. Зависит от конкретной реализации в ядре сделанной конкретным производителем чипа. Но то, что получится нерабочий код это точно.


Таки коллективный разум все еще считает себя умнее и быстрее правильно заинлайненного memcmp ? sm.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 16 2015, 15:08
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (CrimsonPig @ Dec 16 2015, 17:00) *
sm.gif

К чему эта улыбочка? Для начала попробуйте сделать этот самый "правильно заинлайненый". Для начала этого сделать просто не удастся - это библиотечная функция. Посему посморите просто на исходник memcmp() дабы, даже если ее заинлайтить, понять написанную Вами глупость.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Dec 16 2015, 15:25
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(zltigo @ Dec 16 2015, 15:08) *
К чему эта улыбочка? Для начала попробуйте сделать этот самый "правильно заинлайненый". Для начала этого сделать просто не удастся - это библиотечная функция. Посему посморите просто на исходник memcmp() дабы, даже если ее заинлайтить, понять написанную Вами глупость.


Я делаю так:
1. пишу memcmp
2. компилирую в release c соответствующими опциями оптимизации.
3. все

Например, такая вот глупая функция:
int Foo_cmp(const void* apSrc, size_t aNumBytes)
{
unsigned char buf[100] = "abcdef";
return memcmp(apSrc, buf, aNumBytes);
}

компилируется в следующий кусок ассемблерной хрени:
CODE

return memcmp(apSrc, buf, aNumBytes);
0134103E mov esi,0Fh
01341043 lea ecx,[ebp-68h]
01341046 mov edx,offset string "qweqweqweq" (13420FCh)
0134104B jmp Foo_cmp+50h (1341050h)
0134104D lea ecx,[ecx]
01341050 mov eax,dword ptr [edx]
01341052 cmp eax,dword ptr [ecx]
01341054 jne Foo_cmp+68h (1341068h)
01341056 sub esi,4
01341059 add ecx,4
0134105C add edx,4
0134105F cmp esi,4
01341062 jae Foo_cmp+50h (1341050h)
01341064 test esi,esi
01341066 je Foo_cmp+0B9h (13410B9h)
01341068 movzx eax,byte ptr [edx]
0134106B movzx edi,byte ptr [ecx]
0134106E sub eax,edi
01341070 jne Foo_cmp+0A3h (13410A3h)
01341072 cmp esi,1
01341075 jbe Foo_cmp+0B9h (13410B9h)
01341077 movzx eax,byte ptr [edx+1]
0134107B movzx edi,byte ptr [ecx+1]
0134107F sub eax,edi
01341081 jne Foo_cmp+0A3h (13410A3h)
01341083 cmp esi,2
01341086 jbe Foo_cmp+0B9h (13410B9h)
01341088 movzx eax,byte ptr [edx+2]
0134108C movzx edi,byte ptr [ecx+2]
01341090 sub eax,edi
01341092 jne Foo_cmp+0A3h (13410A3h)
01341094 cmp esi,3
01341097 jbe Foo_cmp+0B9h (13410B9h)
01341099 movzx eax,byte ptr [edx+3]
0134109D movzx ecx,byte ptr [ecx+3]
013410A1 sub eax,ecx
013410A3 sar eax,1Fh
013410A6 pop edi
013410A7 or eax,1
013410AA pop esi


В debug версии да, стоит честный вызов memcmp

Сообщение отредактировал CrimsonPig - Dec 16 2015, 15:26
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Jenya7   отследить изменение переменной.   Dec 15 2015, 10:14
- - zltigo   QUOTE (Jenya7 @ Dec 15 2015, 12:14) вопро...   Dec 15 2015, 10:18
|- - Jenya7   Цитата(zltigo @ Dec 15 2015, 16:18) Один ...   Dec 15 2015, 11:09
|- - msalov   Цитата(Jenya7 @ Dec 15 2015, 14:09) так ч...   Dec 15 2015, 11:33
- - Dog Pawlowa   Ну, для начала желательно знать, что за ядро. То,...   Dec 15 2015, 11:32
|- - Jenya7   Цитата(Dog Pawlowa @ Dec 15 2015, 17:32) ...   Dec 15 2015, 11:37
||- - msalov   Цитата(Jenya7 @ Dec 15 2015, 14:37) функц...   Dec 15 2015, 11:41
||- - Jenya7   Цитата(msalov @ Dec 15 2015, 17:41) Адрес...   Dec 15 2015, 11:45
||- - zltigo   QUOTE (Jenya7 @ Dec 15 2015, 13:45) допус...   Dec 15 2015, 12:00
||- - Jenya7   Цитата(zltigo @ Dec 15 2015, 18:00) Нет, ...   Dec 15 2015, 12:07
||- - zltigo   QUOTE (Jenya7 @ Dec 15 2015, 14:07) какая...   Dec 15 2015, 12:18
||- - Jenya7   Цитата(zltigo @ Dec 15 2015, 18:18) 1) Не...   Dec 15 2015, 12:22
||- - zltigo   QUOTE (Jenya7 @ Dec 15 2015, 14:22) и все...   Dec 15 2015, 12:29
||- - msalov   Цитата(Jenya7 @ Dec 15 2015, 15:22) и все...   Dec 15 2015, 12:29
|- - zltigo   QUOTE (Dog Pawlowa @ Dec 15 2015, 13:32) ...   Dec 15 2015, 11:54
|- - Jenya7   Цитата(zltigo @ Dec 15 2015, 17:54) Надо,...   Dec 15 2015, 11:56
- - XVR   Цитатакакая структура. у меня функция принимает ма...   Dec 15 2015, 12:15
- - Jenya7   а что можно прямо так ? (my_struct *) my_arr   Dec 15 2015, 13:39
|- - zltigo   QUOTE (Jenya7 @ Dec 15 2015, 15:39) а что...   Dec 15 2015, 14:48
|- - Jenya7   понял.спасибо.   Dec 15 2015, 14:52
- - Jenya7   сделал листинг ради интереса. Кодif (new_packe...   Dec 16 2015, 08:45
|- - zltigo   QUOTE (Jenya7 @ Dec 16 2015, 10:45) можно...   Dec 16 2015, 11:07
||- - zltigo   QUOTE (CrimsonPig @ Dec 16 2015, 17:25) Н...   Dec 16 2015, 15:46
|- - XVR   Цитата(zltigo @ Dec 16 2015, 18:08) Для н...   Dec 16 2015, 15:30
|- - zltigo   QUOTE (XVR @ Dec 16 2015, 17:30) Не всегд...   Dec 16 2015, 15:38
|- - CrimsonPig   Цитата(zltigo @ Dec 16 2015, 15:38) Догов...   Dec 16 2015, 15:43
- - XVR   gcc 4.8.2 не знает как инлайнить memcmp ( http://g...   Dec 17 2015, 11:53


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th August 2025 - 05:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.06561 секунд с 7
ELECTRONIX ©2004-2016