Является ли определение функции улучшением скорости а не вычислением среднего значения для каждого аналогового входа отдельно

Мой контроллер Arduino считывает данные, поступающие с четырех разных датчиков. После того, как данные будут прочитаны, я индивидуально вычисляю четыре входных средних значения. Я понял, что у меня четыре раза повторяются одни и те же строки кода. Вместо этого я хочу определить функцию с аналоговым выводом в качестве входного сигнала и вычислить среднее значение. Мой код работает нормально. У меня возникает вопрос: улучшит ли эта функция скорость работы, уменьшит ли объем памяти?

Мой код:

// Samples average
sample_cnt = 1000;

//// Input the pin number and compute average value
float Average_input_value(int analog_pin){
  float avg_val = 0;
  for(int i=0;i<sample_cnt;i++){
    avg_val += analogRead(analog_pin);        
  }
  // Разделите на количество выборок, чтобы получить среднее значение
  avg_val = avg_val/sample_cnt;  
  return avg_val;
  }

, 👍0


2 ответа


Лучший ответ:

2

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

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

Где ваша функция выиграет более 4 повторений кода расчета находится в нужном пространстве кода. Функция более компактная, но немного медленнее.

,

1

Просто добавляю несколько цифр, чтобы дополнить ответ Жробера.

На Uno стоимость вызова функции и возврата из нее составляет около 0,5 мкс. Напротив, вызов analogRead() в цикле стоит не менее 112 мкс за итерацию. Учитывая, что вы вычисляете сумму как float (где достаточно подходящего размера целого числа), она вполне может быть больше 112 мкс в вашем случае.

Я не знаю, сколько показаний вы хотите усреднить, но даже если это всего лишь несколько, вызовы analogRead() полностью затмят стоимость использования функции.

,

Большое вам спасибо за ваш ответ. Я решил использовать функциональный подход для усреднения. Прямо сейчас я использую количество выборок 1000 для усреднения. Интересно знать, что вызов функции analogRead () на самом деле занимает в цикле в 1000 раз больше времени, чем в функции., @Mainland