На UNO перестало хватать памяти и пинов, приобрел сегодня китайскую MEGA. По уверению продавца эта модель полный аналог оригинала, те же детали, качественная сборка и так далее. Я попробовал на нескольких скетчах, вроде бы все работает. Но проверка производительности стала неприятной неожиданностью. Признаться, я думал, что MEGA быстрее чем UNO, так ли это должно быть на самом деле? Скетч управляющий двухцветной матрицей 8х8 считает кадры, сколько которые Ардуино может выдать за две секунды. UNO показала 458, MEGA всего 375. Привожу скетч целиком, у кого есть возможность прогоните его на своей плате, пожалуйста и сообщите результат. Прогнать можно на пустой плате, результат выдается в монитор порта. Код (Text): #define DATA_PIN 13 #define LATCH_PIN 12 #define CLOCK_PIN 11 #define kadrTime 100 // мс на кадр #define kadrov 4 // колво кадров byte masRG [4][8][8] = { 0, 0, 0, 0, 0, 0, 0, 0, // 1 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 3, 3, 3, 3, 1, 0, 0, 1, 3, 2, 2, 3, 1, 0, 0, 1, 3, 2, 2, 3, 1, 0, 0, 1, 3, 3, 3, 3, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, //2 1, 3, 3, 3, 3, 3, 3, 1, 1, 3, 2, 2, 2, 2, 3, 1, 1, 3, 2, 0, 0, 2, 3, 1, 1, 3, 2, 0, 0, 2, 3, 1, 1, 3, 2, 2, 2, 2, 3, 1, 1, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, // 3 3, 2, 2, 2, 2, 2, 2, 3, 3, 2, 0, 0, 0, 0, 2, 3, 3, 2, 0, 1, 1, 0, 2, 3, 3, 2, 0, 1, 1, 0, 2, 3, 3, 2, 0, 0, 0, 0, 2, 3, 3, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, // 4 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 1, 1, 1, 1, 0, 2, 2, 0, 1, 3, 3, 1, 0, 2, 2, 0, 1, 3, 3, 1, 0, 2, 2, 0, 1, 1, 1, 1, 0, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2 }; long unsigned int ts; // таймер кадров byte kadrV; // видимый кадр // для подсчета fps long unsigned int ttt; unsigned int sss = 0; unsigned int fps = 0; void setup() { pinMode(DATA_PIN, OUTPUT); pinMode(CLOCK_PIN, OUTPUT); pinMode(LATCH_PIN, OUTPUT); kadrV = 0; ts = millis(); Serial.begin(9600); } void loop() { if ((millis() - ts) >= kadrTime) { // циклическое чередование кадров kadrV++; if (kadrV >= kadrov) kadrV = 0; ts = millis(); } setKadr_RG(masRG, kadrV); // отрисовка кадра // подсчет fps fps++; if ((millis() - ttt) > 2000) { Serial.println(fps); while (true); } } void setKadr_RG (byte mRG[2][8][8], byte kadr) { // отрисовка кадра byte bytSTR; byte mR; byte mG; for (byte s = 0; s <= 7; s++) { bytSTR = 0; bitSet(bytSTR, s); for (byte i = 0; i <= 7; i++) { bitWrite(mR, i, !(bitRead(mRG[kadr][s][i], 0))); bitWrite(mG, i, !(bitRead(mRG[kadr][s][i], 1))); } digitalWrite(LATCH_PIN, LOW); writeByte(bytSTR); writeByte(mR); writeByte(mG); digitalWrite(LATCH_PIN, HIGH); } } void writeByte(byte byteW) { // аналог shiftOut, работает чуть быстрее for (int i = 7; i >= 0; i--) { digitalWrite(DATA_PIN, (bitRead(byteW, i))); digitalWrite(CLOCK_PIN, HIGH); digitalWrite(CLOCK_PIN, LOW); } } Что можно сказать по внешнему виду?
В меге кварц на 16 МГц, как и в уно. С чего ей вдруг быть быстрей? Нужно не скетчи тестовые писать, а читать документацию или хотя бы смотреть таблицу сравнения меги и уно на странице товара.
Эту таблицу я видел, про производительность там ничего не сказано. А скетч не тестовый, просто им довольно наглядно видна разница. И непонятно, почему эта Мега медленнее, несмотря на те же 16 МГц.
Есть некоторое количество факторов, влияющих на произволительность. Основные факторы у уны и меги одинаковые (разрядность МК, тактовая). Потому на простых скетчах выигрыша в производительности не получить, разве что очень мелкий за счет каких-нибудь несущественных особенностей архитектуры МК. А может даже небольшой проигрыш случиться, поскольку пересчет номера пина в порт МК может оказаться сложнее. Или какие мелкие нюансы МК сыграют в сторону ухудшения характеристик. Но за счет некоторых факторов мега может быть существенно быстрее Уны за счет использования своих преимуществ. В частности, больший объем ОЗУ позволяет одновременно держать в памяти больше данных, не подгружая их из progmem или внешнего носителя.
В том то и дело, что производительность разная. Причем, эмперически замечено, что просадка призодится на digitalWrite, digitalRead и аналоговые аналоги. Усушка скорости процентов до 20%! Думаю, что дело в бОльшем кол-ве ног, которые каким то образом перебираются в функциях. Причем, на FastIO разница тоже есть, но намного меньше, порядка 5%.
Если даже так, то это не имеет абсолютно никакого отношения к производительности платы, а точнее, контроллера, установленного на плате. Это чисто программная проблема. Перепишите код без использования библиотек и увидите, что разницы нет.
Прочитайте тему и поймите, что производительность зависит от ядра контроллера и его тактовой частоты. Или объясните почему производительность Дуньки выше.
А вы что подразумеваете под "Дунькой" в таком случае? Традиционно в народе дуней зовут ардуино на AVR.
Давайте возьмем Галлелео, она еще быстрее или вообще десктоп на Core i7. Зачем оптимизировать программу если всегда можно купить железо помощнее? )
Вот из-за таких вот мыслей софт становится все хуже и хуже, а техника вместо полезных вычислений просто зря небо коптит.
Это да. Похоже, что некоторые современные софтопроизводители перепили Фанты. Как там было когда-то в рекламе: "И тормознул я крутую тачку".
Раньше я считал примерно также. По факту, никого не интересует оптимальное решение задачи на минимально возможном железе. Куда больше всех интересует корректное решение задачи за минимальное время. Массовому потребителю во многом безразлично, на каком именно чипе будет функционировать та или иная вещь, главное, чтобы она удовлетворяла его потребности на текущий момент. А после работы маркетологов, менеджеров по продажам и прочих консультантов разница в стоимости железа в процентном соотношении к цене устройства исчезающе мала. Как итог всего этого, имеем что имеем. Да, может это и не оптимальный путь с технической точки зрения, но в условиях капитализма, это самый прямой и верный путь к денежкам потребителя.