|
Локальные переменные. |
|
|
|
Jan 20 2015, 11:33
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Прочитал следующее в ARM System Developer's Guide. Цитата ARMv4-based processors can efficiently load and store 8-, 16-, and 32-bit data. However, most ARM data processing operations are 32-bit only. For this reason, you should use a 32-bit datatype, int or long, for local variables wherever possible. Avoid using char and short as local variable types, even if you are manipulating an 8- or 16-bit value. The one exception is when you want wrap-around to occur. И переделал все локальные переменные на uint32_t. Вопрос - как я понимаю это касается и аргументов передаваемых в функцию?
|
|
|
|
|
 |
Ответов
|
Jan 20 2015, 11:50
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(ViKo @ Jan 20 2015, 17:36)  Да. И возвращаемых значений тоже. Не касается это лишь управляющих структур, массивов, которые используются в программе. Чтобы место экономить. Ну а вот например Код uint32_t MessageChecksum(unsigned char *p, uint32_t len) { uint32_t csum = 0; while (len) { csum+=(*p)&0xFF; p++; len--; } return csum; } тут у меня unsigned char потому что это касается UART я передаю данные 8 бит. или все равно привести к uint32_t? uint_fastXX_t это если я захочу перенести код на AVR
|
|
|
|
|
Jan 20 2015, 12:08
|

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

|
Цитата(Jenya7 @ Jan 20 2015, 11:50)  Ну а вот например Код uint32_t MessageChecksum(unsigned char *p, uint32_t len) { uint32_t csum = 0; while (len) { csum+=(*p)&0xFF; p++; len--; } return csum; } тут у меня unsigned char потому что это касается UART я передаю данные 8 бит. или все равно привести к uint32_t? Если есть ну очень сильное желание, то этот код можно соптимизировать, чтобы он работал с 32-битными значениями. А оно сильно надо ? Этот код критичен к скорости выполнения ? Да, тогда еще возникнет ряд проблем, если размер массива не будет кратен 4 байтам, придется вводить пляски с бубном. Кроме того, могут возникнуть проблемы с выравниванием всего массива входных данных по границе слова. Если char* автоматически выравнен по границе байта, то uint32* будет выравнен по границе 4-х байтов. Если попытаться вычислить сумму начиная с невыравненного адреса, будут проблемы, в т.ч и с производительностью  Общие замечания: 1. в качестве первого параметра надо использовать const unsigned char*, облегчается жизнь себе и компилятору 2. эта контрольная сумма - дерьмо. Она не обнаруживает перестановку байтов, например. Есть гораздо более надежные методы и довольно простые - adler, fletcher checksum, ну и классические CRC
Сообщение отредактировал CrimsonPig - Jan 20 2015, 12:09
|
|
|
|
|
Jan 20 2015, 12:15
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(CrimsonPig @ Jan 20 2015, 18:08)  Если есть ну очень сильное желание, то этот код можно соптимизировать, чтобы он работал с 32-битными значениями. А оно сильно надо ? Этот код критичен к скорости выполнения ? Да, тогда еще возникнет ряд проблем, если размер массива не будет кратен 4 байтам, придется вводить пляски с бубном. Кроме того, могут возникнуть проблемы с выравниванием всего массива входных данных по границе слова. Если char* автоматически выравнен по границе байта, то uint32* будет выравнен по границе 4-х байтов. Если попытаться вычислить сумму начиная с невыравненного адреса, будут проблемы, в т.ч и с производительностью  Общие замечания: 1. в качестве первого параметра надо использовать const unsigned char*, облегчается жизнь себе и компилятору 2. эта контрольная сумма - дерьмо. Она не обнаруживает перестановку байтов, например. Есть гораздо более надежные методы и довольно простые - adler, fletcher checksum, ну и классические CRC это poor man CRC - быстро и просто без заморочек. а вообще прибор работает от батарейки поэтому скорость любой функции для меня важна - быстро отработал и пошел спать. а чем const упрощает жизнь кроме того что не дает модифицировать строку?
Сообщение отредактировал Jenya7 - Jan 20 2015, 12:17
|
|
|
|
|
Jan 20 2015, 12:28
|

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

|
Цитата(Jenya7 @ Jan 20 2015, 12:15)  это poor man CRC - быстро и просто без заморочек. а вообще прибор работает от батарейки поэтому скорость любой функции для меня важна - быстро отработал и пошел спать. а чем const упрощает жизнь кроме того что не дает модифицировать строку? 1. "Просто и без заморочек" - это очень хорошо... только вот с обнаружением ошибок будет весьма плохо. 2. про батарейку - вопрос спорный "быстро отработал" - не значит "мало съел". "Скорость любой функции" соптимизировать невозможно. Например, после долгого вырывания волос из попы автор таки соптимизирует свой алгоритм для работы с 32-битными числами. При этом размер кода вырастет в 2 раза, скорость выполнения увеличится на 0.1%, в то время как эта функция как вызывалась раз в секунду, так и вызывается. Оно того стоило ? Все равно потребление электричества надо будет мерять. Не факт что оптимизация по скорости уменьшит потребление энергии. 3. если гениальный автор с бодуна в своей функции напишет не val=*p++, а *p++ = val, и не протестирует (а некоторые вещи почти невозможно протестировать), то впоследствии может быть горько и обидно. Для меня использование const - это как личная гигиена.
|
|
|
|
|
Jan 20 2015, 12:39
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(CrimsonPig @ Jan 20 2015, 18:28)  1. "Просто и без заморочек" - это очень хорошо... только вот с обнаружением ошибок будет весьма плохо. 2. про батарейку - вопрос спорный "быстро отработал" - не значит "мало съел". "Скорость любой функции" соптимизировать невозможно. Например, после долгого вырывания волос из попы автор таки соптимизирует свой алгоритм для работы с 32-битными числами. При этом размер кода вырастет в 2 раза, скорость выполнения увеличится на 0.1%, в то время как эта функция как вызывалась раз в секунду, так и вызывается. Оно того стоило ? Все равно потребление электричества надо будет мерять. Не факт что оптимизация по скорости уменьшит потребление энергии. 3. если гениальный автор с бодуна в своей функции напишет не val=*p++, а *p++ = val, и не протестирует (а некоторые вещи почти невозможно протестировать), то впоследствии может быть горько и обидно. Для меня использование const - это как личная гигиена. Цитата We saw in Section 5.2.1 that converting local variables from types char or short to type int increases performance and reduces code size. обратите внимание на reduces code size.
|
|
|
|
|
Jan 20 2015, 12:47
|

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

|
Цитата(Jenya7 @ Jan 20 2015, 12:39)  обратите внимание на reduces code size. Книжки надо не только читать, но еще и понимать. Например, замена uint_8 на uint_32 в этом примере вполне себе сможет уменьшить размер кода и сделать мир лучше: for(uint8_t i=0; i<100, ++i) { [do something] } Что будем делать тут? uint32_t CalcCRC(void* apData, uint32_t aNumBytes); uint8_t buffer[100]; uint32_t crc = CalcCRC(buffer, 64); //-- очень хорошо, правда ? crc = CalcCRC(buffer+17, 13); //-- а тут ? Весело? как насчет оптимизации CalcCRC для работы с uint32_t* ?
Сообщение отредактировал CrimsonPig - Jan 20 2015, 12:48
|
|
|
|
Сообщений в этой теме
Jenya7 Локальные переменные. Jan 20 2015, 11:33 Сергей Борщ А чтобы код оставался более-менее оптимальным при ... Jan 20 2015, 11:42  ViKo Цитата(Jenya7 @ Jan 20 2015, 14:50) тут у... Jan 20 2015, 11:56       Jenya7 Цитата(CrimsonPig @ Jan 20 2015, 18:47) К... Jan 20 2015, 12:58        CrimsonPig Цитата(Jenya7 @ Jan 20 2015, 12:58) нет и... Jan 20 2015, 13:39  Сергей Борщ Цитата(Jenya7 @ Jan 20 2015, 13:50) тут у... Jan 20 2015, 17:26   CrimsonPig Цитата(Сергей Борщ @ Jan 20 2015, 17:26) ... Jan 20 2015, 17:40    AHTOXA Цитата(CrimsonPig @ Jan 20 2015, 22:40) v... Jan 20 2015, 18:19     CrimsonPig Цитата(AHTOXA @ Jan 20 2015, 18:19) У Се... Jan 20 2015, 18:27   Jenya7 Цитата(Сергей Борщ @ Jan 20 2015, 23:26) ... Jan 20 2015, 19:05    AHTOXA Цитата(Jenya7 @ Jan 21 2015, 00:05) а str... Jan 20 2015, 19:25     ViKo Цитата(AHTOXA @ Jan 20 2015, 22:25) Испол... Jan 20 2015, 21:12    Сергей Борщ Цитата(Jenya7 @ Jan 20 2015, 21:05) а str... Jan 21 2015, 07:10 Jenya7 спасибо. придется засучить рукава. этож тысячи стр... Jan 20 2015, 12:06 Jenya7 спасибо. узнал много интересного. только вот Серг... Jan 21 2015, 07:24 Сергей Борщ Цитата(Jenya7 @ Jan 21 2015, 09:24) а в т... Jan 21 2015, 07:56
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|