Время на исполнение разных функций
- Войдите на сайт для отправки комментариев
Чт, 06/02/2014 - 22:53
Провел тесты на вермя исполнения разных функций
тестировал таким кодом. менял только функции и типы данных. иногда значения
unsigned long time; int i = 150; int z = 0; void setup(){ Serial.begin(9600); } void loop(){ time = micros(); z = map(i, 0, 255, 0, 200); Serial.println(micros()-time); }
i в основном не меняется и равно 150. пишу значение которое чаще всего повторяется.
плата arduino micro 16МГц
map
int i = 150; int z; z = map(i, 0, 1023, 0, 255); 64мкс z = map(i, 0, 255, 0, 200); 56мкс byte i = 150; byte z = 0; z = map(i, 0, 1023, 0, 255); 54мкс z = map(i, 0, 255, 0, 200); 56мкс
constrain
z = constrain(i, 100, 200); 4мкс z = constrain(i, 180, 200); 4мкс
sin
z = sin(i); 132мкс
cos
z = cos(i); 124мкс
умножение
z = i*i; 4мкс z = 63000*63000; 4мкс z = 2000000000*2; 4мкс
тут я думал будет больше
деление
z = i/30; 20мкс long i = 4000000000; long z = 6000000; z = i/z;; 48мкс
float
умножение
12мкс
деление
36мкс
попробуй
изменится ли время выполнения?
да изменилось. получилось 4мкс
но так как обычно перемножаются объявленные переменные то сделал так
получились теже 12мкс
интересная тема - можно реально тестировать варианты кода на скорость выполнения.
ну и всеми любимый вольтметр на ардуине
128мкс
предлагайте варианты. буду проверять
предлагайте варианты. буду проверять
да - сами у себя бум проверять.
то я тебя попросил потому, что первый результат на твоём железе был замерен.
ну да. только интересная вещь. в 32u4 аппаратный USB и отсылает он в сериал намного чаще чем таже UNO например. везде скорость 9600. странно это
делитесь результатами. будем знать
+ хотя нет. ошибочка вышла. там код был больше и сложилось такое впечатление
проверил последний на uno теже 128мкс
кстати значения скачут периодически немного на обих платах. с чем связано хз
твой амперметр на меге16-й 12МГц - 155-160.
*нужно учитывать, что получаемые значения будут кратны 4-м при частоте 16МГц(у меня на 12-ти - кратны 5-ти), поэтому особой точности на малых значениях добиться не удастся.
позже как нибудь проверю на меге 8мгц. около 200 должно наверно получится
потестил максимальную частоту обновления экрана 1202 ногодрыганьем напрямую через управление портом.
плата ардуино уно
заливал весь экран белым измерял сколько заняло времени, и также черным
вот результаты
1.8" Serial SPI TFT LCD Module Display
потестил частоту обновления дисплея
http://www.ebay.com/itm/1-8-Serial-SPI-TFT-LCD-Module-Display-PCB-Adapter-Power-IC-SD-Socket-128X160-/190920594011?pt=AU_B_I_Electrical_Test_Equipment&hash=item2c73c1125b
андуина уно 16мгц
программный SPI (ногодрыганье)
0,64 кадра/с
1572 мс один кадр
хардварный SPI
6,25 кадров/с
160 мс один кадр
с хардварным намного быстрее, но все равно медленно. попробую покромсать либу для увеличения FPS.
большого ускорения это не даст, только увеличение частоты сильно поможет
+ изменив делитель SPI до минимального 2 получилось немного быстрее (тут уже и далее если буду тестить только хардварный)
1.8" Serial SPI TFT LCD Module Display
продолжение
помучав еще библиотеку и перелопатив ее увеличил еще скорость
хардварный SPI
как он использовался ?
на дисплее 9 бит SPI а в мегах только 8 бит длина пакета
или аппаратно передаётся 8,затем 1 бит в ручную ?
первый бит вручную, отстальные хардварно
именно первый вручную потому что 1 бит задает тип данных: команда или данные, а затем сами данные
а код есть где-то ?
может кому-то пригодится
и мне интересно
http://yadi.sk/d/CXjuENmaEEwun
папка дисплеи
Adafruit_ST7735.zip
доп. пины для дисплея забиты на 9 и 10 пины ардуины
хорошо,благодарю.
а для 1202 какая заготовка использовалась ?
в смысле заготовка?
Serial то наверно прилично сам сьедает ))
Интересно какие настройки оптимизации в ардуине использованы. Ведь в avr-gcc который использует ардуино есть несколько вариантов оптимизации в том числе на скорость
Нормальный компилятор, когда увидит во многих из приведённых примеров, что переменная не изменяется, вычислит её на этапе компиляции и - всё. Чего меряем-то? Сферического коня в вакууме?
З.Ы. Если что - это про подобные вещи:
map, constrain - это вообще препроцессорные директивы, их можно вычислить на этапе компиляции. i - не меняется, и смело можно вычислить на этапе компиляции, чему будет равна z. Так что замеренные величины - это промежуток между двумя отработками функции micros, я подозреваю. Короче, доверять таким "тестам" совсем не стоит.
Верно. Время исполнения micros() 3.5мксек .. можно улучшить до 2.5 .. но все равно оно будет кратно 4мксек. Чтобы такие вещи проверять надо сначала "обмануть" компилятор или отменить ему оптимизацию, а потом делать замеры в длинном цикле и усреднять по количеству повторов.
По мат. функциям времена исполнения есть в описании на glibc .. и там совсем иные чиселки. (может просто надо читать RTFM?) :)