Оптимизация кода, решение проблем пропадания текста (String)
- Войдите на сайт для отправки комментариев
Здравствуйте!
3 день пишу и оптимизирую свой код. И имеются некоторые проблемы в работа, на которые компилятор никак не ругается.
Что я использую в ардуино:
- - Модуль часов (RTC)
- - Датчик влажности и температуры (DHT11)
- - IR (ИК-приемник) для управления с пульта
- - Модуль 4-х реле
- - Cron задания (эмулятор на основе часов)
- - EEPROM память для хранения данных (в частности cron задания и другие переменные)
- - Дисплей 128X64
Иногда, пропадает текст отправленный в Serial.print, к примеру текстовая строка String отправленная в консоль, не всегда отображается, т.е она отправляет но либо пустая, либо порой иероглифами, а иногда нормально. Путем долгих мучений я выявил такую особенность, что если память глобальных переменных занята более ем на 75% начинаются такие проблемы. Но сейчас у меня память занята на 74%.
Если отключить дисплей, то объем глобальных переменных сократится, а значит память будет высвобождена и программа работает корректно. Текст в консоли не пропадает.
Из-за этого, я начал оптимизировать свой код, вынося и сокращая String переменные за функции в один массив, затем я избавился от лишних выводов информации в Serial.print т.к. строки формата String занимают много байт. Но все эти движения не спасли ситуацию, и с использованием дисплея "все ломается". Я понимаю, что загрузил ардуино "по максимум". но память еще есть, как решить данный вопрос?
Прикладывая скетч, помогите решить вопрос, это последний штрих.
Как еще можно оптимизировать программу? Какие методы использовать, дайте хотябы подсказку и я попробую сделать сам.
Можно попробовать уменьшить Serial buffer.
В файле \hardware\cores\arduino\HardwareSerial.cpp есть строка:
Поставьте 32 или 16. Если не будут напрягать паузы при работе сериала, можно поставить 8.
Это в какой версии Arduino ? В только что скачанной нет такой директории \hardware\cores\
Выглядит это так:
4- то есть строка, то нет. Это при том что 74% глобальных переменных используется.
Как еще можно оптимизировать программу? Какие методы использовать, дайте хотябы подсказку и я попробую сделать сам.
1. Отказаться от использования класса String вообще - он очень ресурсоёмкий.
2. Добрая половина из используемых Вами библиотек В Вашем скетче выполняют тривиальные операции, но при этом тянут за собой ого-го сколько. Отказаться от части библиотек, сделав их работу вручную
На второй пункт обратите внимание. Я тут недавно некий проект на Tiny45 делал, а там далласовский датчик температуры. Библиотека DallasTemeperature (а она ещё и OneWire за собой тянет) оказалось насмешкой на ресурсами тиньки. Я просто выбросил её (и OneWire туда же) и написал нужную мне работу с датчиком вручную, благо протокл OneWire подробно в даташите описан - всё влезло.
Жмите Win+F3 и пишите имя файла HardwareSerial.cpp, система найдёт.
В общем, решил я в пойти по другому пути. Отказался я от меню, а отправлять данные буду по WiFi модулю. По нему и буду отправлять с компьютера задания по крону и другие параметры.
Скетч получился в 30кб, а места всего 32, кроме того памяти категорически не хватает для выполнения данных простых задач.
Всем спасибо за внимание.
Жмите Win+F3 и пишите имя файла HardwareSerial.cpp, система найдёт.
Дело не в Serial, он тут вообще не причем. Текст иногда пропадает даже на дисплее, иногда он кракозябрами. Это из-за формата String, а char для моих задач не подходил.
а char для моих задач не подходил.
"Не любите кошек? Вы просто не умеете их готовить!" :)
а char для моих задач не подходил.
"Не любите кошек? Вы просто не умеете их готовить!" :)
Хорошо, как можно используя char записать такую строку:
?
пользоваться всякими приблудами вроде toCharArray не вижу смысла
Вам уже правильно отписали: ресурсы "съедены" вовсе не вами, а теми Г-изделями, что называются "библиотека для Ардуино". Тому что вы делаете, памяти у УНО или Про Мини (как понимаю эти версии в работе) - более чем достаточно. Не пользуйте Wiring и будет вам "щастье". Обсуждено тут многажды. Вот даже ЕвгенийП уже осознал сей прискорбный факт. :)
я тут вспомнил про sprintf, вот она могла бы подойти для таких вырожений. Однако, есть некоторые тонкости
к примеру есть функция
Ее вы можем вызвать так:
В последнем варианте будет ошибка, т.к это уже будет не char, а String, компилятор выдаст ошибку.
Конечно, можно воспользоваться функцией strcat, но получает уже не то и не красиво, а чтоб записать строку придется объявлять ранее переменную типа char. То же относится и к sprintf где первым агрументом должен быть буфер типа char, которую так же необходимо предварительно объявить с определенным размером, мы можем вписаться в него, а можем и попросту расходовать занятую память. Нелогично.
String ресурсоемкий, но и char не исключение. Чем отпличается char[10] от String = "123456789"; ?...
А вообще, память благополучно была снижена до 69%! Путем уменьшения переменной Crons[10] на Crons[6] поскольку, для моих задач хватит и 6. Но это 4 занимали порядком памяти глобальных переменных. Вообще, можно было и поизвращаться, например прикрутив SD карту. Но что-то жирно будет для обычного контроля освещения по заданию cron и системы автоматического полива каждые n минут по n раз c n продолжительностью в секундах и выводом всего этого в меню, для дальнейшего редактирования.
Почему разработчики не сделаю память 4кб как старт или 16? в 21 веке живем, экономят на всем.
Вы передаете структуры и String в функции по значению, что приводит к передаче копии.
void foo(const Cron &d) более правильно, нежели void foo(Cron d).
На размер программы это может не отразиться, но размер используемого ОЗУ будет меньше, да и бессмысленного выделения памяти, а потом её освобождения компилятору уже не понадобится.
Вцелом, передача Объектов производится либо константной ссылкой, либо, если требуется модификация, передаётся указатель на объект.
Это же внутри функции, это память затрагивает только единожды при выполнении. Конечно, в некоторых случаях это выйдет боком.
Вот у меня вопрос на будущее, как лучше и где хранить большие текстовые строки, 32 кб, это довольно достаточно даже для строк типа String и по моим планам входило в рамки, и вошло. Вот только почему то String пропадает или передается некорректно, в то время как char работает хорошо. Я даже специально провел эксперимент, загрузил скетч максимально, программа то и делала что слала определенную строку в консоль. Если это была строка (String) то при занятой памяти более 75% были косяки в ее отображении, были крякозябры и прочее. Потой эта строка была бесконечной что приходилось перезагружать ардуино. А char же напротив, даже при 80% занятой памяти не давал сбоев. Но работать c char неудобно, или непривычно. Строка легко модифицируется, в то время как для char стоят небоскребы для изменения..
Ну что ж, удивляйтесь дальше. String использует, жрёт ОЗУ, функции при вызове делают копию объектов, снова жрут ОЗУ. Я Вам про то, как правильно передавать объекты в качестве параметров, а Вам это не нужно, ну как угодно.
Хорошо, как можно используя char записать такую строку:
?
Элементарно, Ватсон!
пользоваться всякими приблудами вроде toCharArray не вижу смысла
И ещё, чтение разных топиков и комментариев, позволило мне сделать вывод, что kisoft здесь один из лучших специалистов. Он выделил время на чтение Вашего кода и сделал предельно корректное, а главное, абсолютно верное замечание. Но вместо "спасибо" он получил попытку оспорить его замечание, причём попытку столь же безграмотную, сколь и наглую. Если Вы знаете как программировать лучше, чем он - какого чёрта Вы здесь вопросы задаёте? Тем более, если ответов слушать не хотите? У Вас зуд поспорить и умность свою показать? Давайте это без нас: сами задавайте вопросы, сами на них отвечайте и сами с собой спорьте. До свидания.
даже ЕвгенийП уже осознал сей прискорбный факт. :)
Ни хрена не осознал, Вы меня в свою секту не записывайте! :)
Моё осознание не меняется с тех давних и уже почти легендарных времён, когда я на 96 байтах ОЗУ системы навигации делал. И осознание это я много раз Вам доводил: бороться за память, когда её хватает, т.е. "бороться ради борьбы" считаю онанизмом. Когда же её не хватает, уж будьте уверены - ужмусь и в игольное ушко пролезу не хуже других.
Так "не верю", пока примеров не увижу .. вот, увидел и сделал свой "вывод", пусть и не очень верный. :)
Так "не верю"
Ну, это уж точно не моя проблема :)
Например?
И не делайте поспешных выводов за меня. Возможно в Си я не силен, зато уже 7 лет веду разработку на другиях языках и уверен знаю их лучше Вас. Но мы здесь собрались чтоб не письками мериться, а решить проблему. kisoft выдвинул замечание по коду, очень хорошо, спасибо. Но я уже сделал по другому.
вот читаю тут и думаю, сделать конструктор смс как String или как буквы через char? - где и в чем выигрыш?, считая и то и то получается 50/50 и кто что скажет?
Мне казалось, я с Вами уже попрощался.
Например?
Я Вам уже сказал в посте №6: "сами задавайте вопросы, сами на них отвечайте и сами с собой спорьте", а меня увольте. Тем более, что:
уже 7 лет веду разработку на другиях языках
Но мы здесь собрались чтоб не письками мериться
Действительно не надо. Вы смешно выглядите :)
а решить проблему.
Да, нет. Вы пришли сюда, очевидно, нас потроллить. Тот плёвый пустяк, что выбран в качестве повода никак не может быть проблемой, для человека, который уже 7 лет программирует.
До свидания, ещё раз.
вот читаю тут и думаю, сделать конструктор смс как String или как буквы через char? - где и в чем выигрыш?, считая и то и то получается 50/50 и кто что скажет?
Валера, Вы ведёте сябе как Архат - не с того конца подходите. Не от задачи, а от инструмента.
Поймите не бывает инструментов плохих или хороших. Каждый хорош будучи применён с умом и в правильной ситуации.
Поэтому ответить на Ваш вопрос, что лучше "char" или "String" невозможно, не зная задачи и условий её выполнения.
Чтобы Вам было понятнее, ответьте сами, что лучше Мерседес-кабриолет или Камаз с фурой? Только при ответе учитывайте, что Вы не знаете что нужно спрашивающему - девочку покатать или партию холодильников перевезти. Вы сможете ответить?
Вот таков же и Ваш вопрос. Вы понимаете о чём я?
в том та и вся соль, что для чего лучше или хуже, я просто задал вопрос и жду разные мнения
Евгений, не обижайтесь, я держу паяльник с пяти лет, и я думаю что архат тоже хочет что-то сделать что - то (это его проблемы), вам этого не понять, и вы это не пытаетесь даже, так что ой!!
Вы видимо не видите разницы, а я Вам поясню, что каждый язык программирования по разному построен, по разному работает. В тех сфеах что работаю я, таких проблем с паматью нет да и там не приходится выбирать char или String. Все потому, что для них это одно и тоже. Но сталкнувшись с C++ я для себя открыл много вопросов. И все что я здесь говорю, это исключительно наработки моего опыта в других сферах. Вы говорите что я оспариваю ваше мнение? Ни в коем случае, я лишь привожу частичку своих знаний в этом. Я могу быть не прав, в данном вопросе, поскольку повторюсь с С++ я не сталкивался ранее. Учусь я быстро, мне нужно лишь понять и открыть новые возможности програмирования в нем, которые мне не известны. С каждой задачей я открываю все больше нового. Но когда я опираюсь в ограничения, это заставляет меня изрядно "попотеть", так отсюда и появился вопрос решения которого еще не последовало, за исключением предложенного kisoft.
Лично Вы предложили исключить некоторые библиотеки заменив их работу своим кодом. Я провел тестирование, все эти библиотеки практически не нагружали память глобальных переменных, лишь увеличивали размер скетча. Я говорю конкретно о решении вопроса с памятью! И как можно по другому было решить тот вопрос с меню, который я реализовал. В интернете полно решений с реализацией меню, но все они несут скорее информационную долю.
Я учту все Ваши замечания и предложения по моей работе, поскольку я учусь и могу не знать того, чего знаете Вы. Я ожидал здесь более теплого приема, чем камни с помидорами.
Мужчины, попрошу больше не склонять мой ник в каких бы то ни было целях. Увы, форум не позволяет ни игнорировать, ни многого другого, что очень прискорбно. Лично меня не парит, если ко мне не прислушиваются, потому что Богом я себя не считаю. Всем удачи!
Евгений, не обижайтесь, я держу паяльник с пяти лет, и я думаю что архат тоже хочет что-то сделать что - то (это его проблемы), вам этого не понять, и вы это не пытаетесь даже, так что ой!!
Похожий ник наблюдал на skif.biz, где-то в 2005-м, откуда-то поблизости .. не Вы, случаем? У меня тогда так и не получилось из КЗ обмоток запилить "сверхтранс" .. магнитное поле разделенное КЗ обмоткой ведет себя как "коггерентное" и не складывается. :)
Похожий ник наблюдал на skif.biz, где-то в 2005-м, откуда-то поблизости .. не Вы, случаем? У меня тогда так и не получилось из КЗ обмоток запилить "сверхтранс" .. магнитное поле разделенное КЗ обмоткой ведет себя как "коггерентное" и не складывается. :)
Вы ошиблись
Ну так к чему пришли? Я сейчас тоже столкнулся с тем что уже схавал 60% памяти. Пробежался по переменным, 12% высвободил. Использую вот такую конструкцию:
Или такую функцию:
Собственно вопрос, что же все таки правильно использовать? и как дела с boolean? Я вообще только вот недавно стал гондобить проекты где памяти не хватает, а так я виндовый программер, мне эти различия int и long int там ни к чему, один хер винда сожрала кучу лишнего, мои 10метров памяти ни чего страшного не сделают ) А тут вот начинаю понимать, что там где до этого я бездумно кидал int, теперь смотрю что-то может можно и char и как я понимаю char - минимальная единица который выделяется 8бит. Получается тот же bool по факту char в размере? И смысл тогда от byte? ведь все равно 8бит выделяется памяти?
И как избавитсья от String для результат выполднения функции? Ведь размерность я не могу заранее предугадать.
Я сейчас тоже столкнулся с тем что уже схавал 60% памяти. Пробежался по переменным,
А с какой целью пробегались? Что-то большое впихнуть собираетесь? Или чисто из эстетических соображений? Так-то в принципе её хватает.
У меня молодые сторудники (студенты или вчерашние студенты) тоже любят поэкономить то, чего и так хватает. Эстеты. Если программа жрёт лишний байт или работет лишнюю микросекунду - они "кушать не могут". Еле отучил - пришлось прибегнуть к жёстким мерам. Вот с одним был такой диалог:
- (ОН) смотри, я тут пару дней поковырялся и сэкономил 4КБ.
- а что памяти не хватает?
- да, нет, там ещё много, но всегда ведь лучше сэкономить да и просто так красивее.
- знаешь, что! Мы пошли на установку большей памяти, хотя это и удорожило изделие, исключитально для того, чтобы сотрудники не тратили рабочее время на её экономию. Мы заплатили за память, чтобы не оплачивать лишние рабочие часы. Ты же предлагаешь нам оплачивать и то, и другое. Извини. Пару дней, говоришь, ковырялся? В этом месяце 20 рабочих дней, так что с тебя будет удержано 10% зарплаты, т.к. два дня ты занимался удовлетворением своих эстетических потребностей, а не работой на проект.
Как-то так.
Нет, в любительском проекте (который сам финансируешь) - не вопрос. Если доставляет удовольствие, то почему бы и нет? Сам иногда эстетствую. Но это непрофессионально.
P.S. Кстати, сообщение IDE моего сегодняшнего проекта на ATtiny45:
Sketch uses 4 088 bytes (99%) of program storage space. Maximum is 4 096 bytes.
А с какой целью пробегались? Что-то большое впихнуть собираетесь? Или чисто из эстетических соображений? Так-то в принципе её хватает.
P.S. Кстати, сообщение IDE моего сегодняшнего проекта на ATtiny45:
Sketch uses 4 088 bytes (99%) of program storage space. Maximum is 4 096 bytes.
Пока только вывод изображения о том что нет соединения с "сервером" (другая ардуинка), и с 10-ок кнопок. Ну AdafruitGFX + TouchScreen + шрифт для вывода русских символов. Из-зна них пришлось вот довесить целый класс String. Кнопки пока без обработчиков, точнее обработчик нажатия один, а вот то что должно случиться много. Потом из всего случившего надо собрать последовательности символов и залепить в serial, А еще надо постоянно читать serial и разбирать его для отображения данных. Так что - да. Еще много. И вопрос был не только в размере скетча.
Global variables use 1,056 bytes (51.6%) of dynamic memory, leaving 992 bytes for local variables. Maximum is 2,048 bytes.
Вот я к чему веду. А с "дисковым" пространством все еще хуже:
Sketch uses 26,474 bytes (82.1%) of program storage space. Maximum is 32,256 bytes.
Правда внешних либ больше не будет, что уже радует. Ибо даже то что я уже влез в String позволит мне отказаться от некоторых своих изысков в пользу решений этого класса.
У меня молодые сторудники (студенты или вчерашние студенты) тоже любят поэкономить то, чего и так хватает. Эстеты. Если программа жрёт лишний байт или работет лишнюю микросекунду - они "кушать не могут". Еле отучил - пришлось прибегнуть к жёстким мерам. Вот с одним был такой диалог:
- (ОН) смотри, я тут пару дней поковырялся и сэкономил 4КБ.
- а что памяти не хватает?
- да, нет, там ещё много, но всегда ведь лучше сэкономить да и просто так красивее.
- знаешь, что! Мы пошли на установку большей памяти, хотя это и удорожило изделие, исключитально для того, чтобы сотрудники не тратили рабочее время на её экономию. Мы заплатили за память, чтобы не оплачивать лишние рабочие часы. Ты же предлагаешь нам оплачивать и то, и другое. Извини. Пару дней, говоришь, ковырялся? В этом месяце 20 рабочих дней, так что с тебя будет удержано 10% зарплаты, т.к. два дня ты занимался удовлетворением своих эстетических потребностей, а не работой на проект.
Как-то так.
А вот тут отчасти я с Вами не согласен! Да что там от части. Много не согласен. Скажем высвободить 4K места при 32k всего возможных... это очень даже не плохо. Тем более пока код только написан и ты не разбираешь его заного. Вот 7 лет назад я писал обработку баз данных. Там dbf изначально без индексов, общий объем где-то 400MB. В общем из 2-х программ я одлжен был получить результаты в 3-ю. Тот код обрабатывал эти данные порядка 3-4 часов. При этом приходилось создавать порядка 100MB временных таблиц.
Полтора года назад код был переписан. Сейчас на все про все уходит 1 час, элементарно структурировав исходные таблицы перед началом работ, дабавив в них индексы, убрав не нужные данные для меня и переписав часть выборок. Временных таблиц 3 и и их размер сейчас где-то 10MB. По факту сейчас 2 узких места - сравнение идентификационных данных в 2-х программах (приходится сначала удостоверится что каждой записи из проаграммы 1 есть запись в программе 2 и у этих записей есть параметры которые отвечают опредленным критериям и потом наобород) и фактически сам расчет сумм (его ни как не удается завернуть в запрос, слишком много вещей которые sql хоть и потянет, но запрос будет настолько монструозным и многие моменты прийдется запрашивать по 10 раз, когда я просто значение записи присваиваю переменной).
Так что оптимизация - вещь шикарная. Есть пределы, но и вот так вот на корню рубить... а потом мы удивляемся, почему калькулятор запускается 30 секунд. Просто я для себя решил - оптимизация, хотя бы 1 проход по коду - обязателен. Вот сегодня первый раз пересматривая одну функцию я заметил что под конец функции заводится 2 переменных int8_t, а у меня во входных параметрах инициализировано 8 int16_t при том 2 из них дальше по коду уже мною не используются. Зачем заводить еще лишних 16бит, когда есть уже инициализированные и еще не уничтоженные 2 по 16?
А вот еще процесал функцию вывода текущих параметров. До:
Скажем высвободить 4K места при 32k всего возможных... это очень даже не плохо.
Это не может быть ни плохо, ни хорошо, без дополнительной информации.
Главный вопрос: а что потом произошло с этими 4К?
Они были использованы для новой функциональности, которая раньше не лезла? Тогда это не "неплохо", а просто отлично! А вот если они так и остались неиспользованными в конечном изделии, то это не просто плохо, а ужасно - на их "экономию" были впустую потрачены ресурсы проекта.
Вот эту простую мысль я пытаюсь довести до сотрудников. И с нею согласны все, кто реально руководил реальными коммерческими проектами (под "руководил" я понимаю - отвечал не только за техническую сторону дела, но и за бюджет тоже).
Вот и я до Вас! Через пол года, или 5 лет Вас попросят добавить рюшку. Она будет как раз 4К, а их нет. И тогда Вы будете разбирать скорее всего уже чужой код и переведете на только понятие его столько же времени. Оптимизация должна быть обязательной. Код нужно вычитывать после отладки обязательно. И я с вам не спорю что нужно выжимать, но если эта трудозатрата стоит того, то почему бы и нет. Скажем возьмем 16U - стоит она 50 рублей. 32U стоит 75 рублей. При тираже в 1000000 штук оптмиизировать лишний 1К будет более чем, чем покупать 32-ю.
А по Вашему - вы после отладки сразу запусливаете в продакшен.
после отладки сразу запусливаете в продакшен.
К сожалению такая практика имеет место быть. От чего все (конечный потребитель, заказчик и разработчик) потом и страдают. Зато в срок сдано!
В остальном я +1.
Экономить ресурсы необходимо в начале проекта, потом уже поздно. Исправлять, тем более спустя срок - намного дороже, одна регресионка и исправление вылезжших ошибок потянет на огого человекодней. Профилактика лучше лечения и пожаротушения. Послушать ЕвгенийП, так непригодившийся пока огнетушитель - совершенно лишний предмет, надо выкинуть из офиса и авто. И уж ни в каком разе не покупать.
По теме ТС. Либки ардуновские - плохо за редким исключением. Зато на них можно быстро проверит исправность свежекупленой железяки, правильность монтажа и могут послужить донорами для написания своих, рассово верных либ. Строка как екземпляр класса (String и т.п.) - плохо. Потому что может содержать неявные действия, за простым "a"+"b" может и релокейт прятатся. Допустимо в простых прогах ПК, не более. Можна конечно написать класс строк и без этого, но тогда это просто обертка на char[] без каких либо плюсов и минусов. Кто не согласен - ИМХО, я не виноват ;)
Sirota,
я говорю по опыту, а Вы теоретизируете :)
Через пол года, или 5 лет Вас попросят добавить рюшку.
но если эта трудозатрата стоит того
Кто это определяет? В моих проектах - я. Вот я и оштрафовал сотрудника, т.к. один день его работы обходится фирме в 9 тыс. рублей, а ни на копейку улучшения продукта от его оптимизации я не заметил.
А по Вашему - вы после отладки сразу запусливаете в продакшен.
попросят, так оплатят новую работу.
Угу. Захотят добавить пару датчиков, а им трудозатраты в 30% от всех затрат на проект за всё время разработки. В таких случаях "выгребают" уже не прогеры, а прожектмены и архитекторы, потому как вовремя не думали о ресурсах. А если они еще и штрафовали за экономию то воще печалька.
Угу. Захотят добавить пару датчиков, а им трудозатраты в 30% от всех затрат на проект за всё время разработки.
Не знаю, в каком мире Вы живёте. В реальном мире, существует договор и стороны действуют в соответствие с договором. Если в нём предусмотрено "добавление пары датчиков" после сдачи изделия, то это будет учтено при разработке. А если нет, то они захотят не "добавить пару датчиков", а разработать новую версию изделия с расширенной функциональностью. Во что это им обойдется - зависит от миллиона вещей. Например, этим датчикам может элементарно питания не хватить. Что, заранее надо было питание с трёхкратным запасом делать? И сколько бы проект стоил?
Свеженький пример из жизни: договор - кластер на 20 узлов с возможстью расширения до 30. Сделали. Сдали. Заказчику вдруг протребовалось расширить не до 30, а до 36. Посчитали, сделали предложение. Тот типа как Вы "чего это мне вкатили такую цену, всего-то на 6 узлов больше, чем было оговоренно.!" Ему объяснили, что добавить-то узлы не проблема, только системы питания и охлаждения заточены под 32 узла - максимум, так что если нужно 36 - переделываем пиатние и охлаждение, а это половина цены всего проекта. Заказчик почесал репу и остановился на 32.
я говорю по опыту, а Вы теоретизируете :)
Культура программирования. У Вас же на выходе только деньги. При чем толко себе. По факту барыга. Возможно таким и стоит быть, но тогда и 32MB памяти на 16MHz процессоре скоро будет мало если с таким подходом учить молодеж.
Угу. Захотят добавить пару датчиков, а им трудозатраты в 30% от всех затрат на проект за всё время разработки.
Не знаю, в каком мире Вы живёте. В реальном мире, существует договор и стороны действуют в соответствие с договором. Если в нём предусмотрено "добавление пары датчиков" после сдачи изделия, то это будет учтено при разработке. А если нет, то они захотят не "добавить пару датчиков", а разработать новую версию изделия с расширенной функциональностью. Во что это им обойдется - зависит от миллиона вещей. Например, этим датчикам может элементарно питания не хватить. Что, заранее надо было питание с трёхкратным запасом делать? И сколько бы проект стоил?
Свеженький пример из жизни: договор - кластер на 20 узлов с возможстью расширения до 30. Сделали. Сдали. Заказчику вдруг протребовалось расширить не до 30, а до 36. Посчитали, сделали предложение. Тот типа как Вы "чего это мне вкатили такую цену, всего-то на 6 узлов больше, чем было оговоренно.!" Ему объяснили, что добавить-то узлы не проблема, только системы питания и охлаждения заточены под 32 узла - максимум, так что если нужно 36 - переделываем пиатние и охлаждение, а это половина цены всего проекта. Заказчик почесал репу и остановился на 32.
Не надо уводить тему разговора от разработки ПО. А то я тут давеча такси ловил, таксис хотел 100 а я давал 80. Этот таксист был послан ни с чем, а другой за 80 повез. И все в рамках договора.
Есть железо и есть ПО, у всего своя специфика. Про железо в другой ветке.
И если по завершению договора клиент желает заключить новый договор на те же +2 датчика, то выкатывать ему прайс как за пол разработки - прямой путь ити следом первого таксиста. Да конечно многое может осложнить решение, питание, архитектура ПО и т.д. Но если блокирующее - это криворукость прогера, разбазаривающего ресурсы при попустительстве менеджера - можна закрывать лавочку, клиент попал, может искать новых разработчиков. В моей практике есть проекты активно развивавшиесе более 10 лет, и хотелки клиентов решались за адекватные трудозатраты. Разумеется по соответствующим договорам. А все в том числе и потому, что перед доработкой проводилось нормальное проектирование, на этой стадии и определялось в т.ч. де и сколько памяти и производительности должно потребоватся из весьма ограниченых ресурсов.
Культура программирования.
Культура программирования состоит не в том, чтобы тратить два дня на никому ненужную экономию четырёх килобайт, а в том. чтобы сразу писать пристойный код, который легко тестируется и не особо разбрасывается ресурсами.
У Вас же на выходе только деньги.
Ну, не только, но деньги - очень важная вещь. Мне, знаете ли, надо кормить коллектив в котором десятки людей, у каждого из которых семьи. И каждый из которых должен пятого числа получить зарплату.
Кстати, это одно из отличий профессионала от любителя. Любителю в разумных пределах всё равно сколько стоит создаваемый им продукт, профессионалу - нет.
По факту барыга.
По факту - хам.
тогда и 32MB памяти на 16MHz процессоре скоро будет мало если с таким подходом учить молодеж.
Какой-то у Вас двоичный мир - либо ноль, либо единица. Я разве говорил, что оптимизировать не надо? Я говорил, что этого не надо делать там, где задача этого не требует. А там, где требует - конечно, нужно соки выжимать. Какой идиот будет с этим спорить?
Не надо уводить тему разговора от разработки ПО.
Я уже говорил, что я здесь не теоретизирую, я говорю из практики. В жизни я разрабатываю большие программно-аппаратные комплексы. Вот и пример был оттуда.
По факту - хам.
По факту от Вас тут толку ноль. Я поставил вопрос, мне нужно его решить. Вопрос зачем мне его решить Вас не касается. Вы развели полемику - мол оптимизация - херня. Я объяснил, но все равно помощи от Вас нет и в помине. Прошли бы мимо и все если не хотите и/или считаете лишним. А так совета то от Вас дельного не поступило, одна Бла-бла-бла. Так и пректы у Вас:
Потому что бла-бла-бла.
А мне помог человек, рассказал что и как. Вычитав в названии функции utf8 сразу запалил что я работаю не только с ASCII и что в одном случае один символ - это char, а в другом он уже не помещается в него, и по этому в функции оптимизировать не чего.
А по поводу:
сразу писать пристойный код, который легко тестируется и не особо разбрасывается ресурсами.
Ну если Вы такой гений, то конечно пожалуйста. Ни кто не против. Но скажем я только перешел с x86 и там я не задумывался о char. У меня целое всегда начиналось с int. Ведь там-то в наше время есть куда развернуться. Хотя и там я проводил оптимизацию, но только на скорость, объемы памяти в моих проектах меня не волновали.
А мне помог человек, рассказал что и как. Вычитав в названии функции utf8 сразу запалил что я работаю не только с ASCII и что в одном случае один символ - это char, а в другом он уже не помещается в него, и по этому в функции оптимизировать не чего.
В первом топике темы http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafru... подробно описано как работает функция utf8rus.
sirota не удивляйтесь, ответы на мои вопросы аналогичны.
"Я умею, я могу, я знаю"... А как? Думайте сами!
Ваши сообщения в этой теме, уважаемые, трата времени, если не собираетесь помогать друг другу или драться, смысл разводить руками?
Ключевая фраза в вашем опусе. Как понимаю, сотрудника ПРЕДУПРЕДИТЬ ЗАРАНЕЕ об этом внезапно забыли. Наверное как раз для такой цели - удержать 10%, когда он "сэкономит". :)
И правильно что не согласны. Просто говнокодерство возведено в ранг "профессионализма" и все больше занимает агрессивную позицию на рынке ПО. Нечему удивляться в 30сек. запуске калькулятора .. или то, что "Фобос - в грунт". Говнокодерский подход ничего иного создать не может. Зато "быстро": "тяп-ляп и готово".
Как понимаю, сотрудника ПРЕДУПРЕДИТЬ ЗАРАНЕЕ об этом внезапно забыли.
Хреново понимаете. У сотрудника было конкретное задание на которое он забил, и два дня потратил на никому нахрен ненужную оптимизацию. Теперь стал дисциплинированнее.
А то раньше с ним удержу не было. Другой пример с ним же: был кусок кода, который формирует содежимое экрана, выводит его и ждёт ввода от оператора. Формирование содержимого и вывод занимали около 20мс. Кусок работал уже в нескольких версиях продукта и "есть не просил". Этот орёл "соптимизировал" до 9мс. На впоросы "заметит ли это оператор?" "увеличит ли это общую скорость работы?" и, наконец, "кому это нахрен нужно?" мялся и говорил, "так быстрее же"! Тогда объяснили словами - не понял. А вот после штрафа, вдруг дошло, что профессиональная работа и "ускорения ради ускорения" (вернее ради того, чтобы самому себе доказать, что "длинее") - это вовсе не одно и тоже.