У меня есть функция в моем основном цикле, которая называется ~ 200 Гц. Он работает на NXT, поэтому процессор довольно медленный. В моей функции он создает переменную, записывает ее на экран и завершает работу. Из-за скорости процессора мне нужно, чтобы эта функция работала как можно быстрее, и мне было интересно, быстрее ли объявлять переменную в глобальной области и сбрасывать ее каждый раз при вызове функции или создавать ее экземпляр внутри функции. Для пояснения, какой пример будет быстрее?

 int foo=0;
 void bar() {
    foo=0;
    //do something with foo
 }

Против

void bar() {
   int foo=0;
   //do something with foo
}

Очевидно, я хотел бы использовать второй фрагмент в своем коде, потому что глобальные переменные считаются «плохими», но процессор NXT очень медленный.

c nxt
1
mailmindlin 29 Авг 2014 в 18:55
1
Измерьте разницу.
 – 
jxh
29 Авг 2014 в 18:56
Используйте второй фрагмент. это явно можно сделать только с помощью регистров, тогда как первый фрагмент может (вероятно, будет) включать chache/memory/file
 – 
Steve Cox
29 Авг 2014 в 18:56
200 раз в секунду? Похоже, у вас есть максимум 5 мс, чтобы что-то сделать с foo.
 – 
Elliott Frisch
29 Авг 2014 в 18:57
Насколько быстрый ваш процессор? насколько сложная функция?
 – 
Jason Hu
29 Авг 2014 в 18:59
5
Запись переменной на экран затмит разницу во времени между инициализацией внутри и вне цикла.
 – 
Don Shankin
29 Авг 2014 в 19:00

2 ответа

Лучший ответ

Когда у вас есть что-то подобное, лучше всего просто измерить скорость обоих вариантов. На самом деле нет никакого способа узнать наверняка, что было бы лучше без их тестирования, особенно с учетом того, что вы не знаете, как ваш компилятор даже компилирует ваш код.

1
Steve Cox 29 Авг 2014 в 19:42
1
Кроме того, просто используйте здравый смысл/здравый смысл. Как указывает @DonShankin в комментариях, ввод-вывод дисплея, который также выполняется, вероятно, займет на несколько порядков больше времени, чем инициализация локальной переменной, поэтому не беспокойтесь об этом. Если функция оказывается слишком медленной, затем исследуйте/профилируйте.
 – 
nobody
29 Авг 2014 в 19:31

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

Однако я специально использовал слова «обычно» и «в целом»: оборудование может существовать там, где это не так. А про ваш процессор я не знаю. Так что, конечно, прислушайтесь к совету Алекса Клеймана и измерьте. Когда дело доходит до оптимизации, измерение - единственный источник истины.

0
cmaster - reinstate monica 29 Авг 2014 в 20:29