реклама на сайте
подробности

 
 
4 страниц V  « < 2 3 4  
Reply to this topicStart new topic
> Управление контекстом БЕЗ RTOS
Golikov A.
сообщение Nov 28 2014, 15:49
Сообщение #46


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



вопрос в другом.
Разве в С++ есть for без ;; ?
for(int i=0) - так же нельзя или уже можно?
Go to the top of the page
 
+Quote Post
Slash
сообщение Nov 28 2014, 16:07
Сообщение #47


Местный
***

Группа: Участник
Сообщений: 202
Регистрация: 10-04-05
Из: Санкт-Петербург
Пользователь №: 4 011



Сколько не читал битв "C vs C++", почему то противники С++ "заставляют" его использовать в самых "тяжелых" проявлениях - RTTI, виртуальные функции (хотя они не тяжелые).
С++ можно использовать только за более жесткий контроль типов. И все.
Потом понять, что ссылки - это удобно и код становится чище.
Потом начать применять приведение типов static_cast(безопасное) и reinterpret_cast(опасное, на усмотрение программиста) вместо С-ного приведения типа (uint32_t *)var. Представьте, как легко найти в коде места, где вы приводите типы рискованно и которые надо проверить в случае ошибки.
Потом понять, что конструктор - это удобно. И их можно использовать в структурах.
Пространства имен.
Все эти возможности несут нулевой оверхед и делают код удобнее и понятнее.

Цитата(Golikov A. @ Nov 28 2014, 18:04) *
чего то я видать безнадежно устарел
Код
for (const Point & point : pointsArray)

вот это что за на?

Это нововведение стандарта С++ за 2011 год - "range-based for".
Отлично описано в этой статье

Цитата(jcxz @ Nov 28 2014, 18:34) *
Вся эта си-плюс-плюсная объектно-инкапсулированная хрень хороша только для тех, кто не заглядывает в файлы листинга компилятора.
А если Вы задумываетесь об оптимальности не исходников (как здесь), а результирующего кода (скорости выполнения и размера), то выбирайте наиболее стандартные конструкции, типа for (int i = 0; i < n; ++i). Оптимизаторы компиляторов на них наиболее "натасканы" и код будет оптимальным.

А не нужно туда заглядывать.
Задач, где нужна оптимальность кода, не так много. Чаще пишется обычный, не критичный ко времени исполнения код, развесистая логика. Тут важнее читабельность исходников. И не только для автора.
Разговоры "я пишу один и мне все понятно" в пользу бедных.

Цитата(jcxz @ Nov 28 2014, 18:34) *
Я, после опыта оптимизации по скорости DSP-кода, взял это себе за правило - если хочется чтобы код был наиболее оптимален после компилятора, конструкции в исходнном коде должны быть наиболее простыми.
На входе у меня был вот такой вот весь правильный С++ код, со всеми конструкторами/деструкторами и т.п. и при этом он безбожно тормозил и алгоритм не успевал обработать поток данных. После убиения всей этой плюсовой красоты и полного переписывания на простой си-код, скорость выполнения того-же самого алгоритма увеличилась в несколько сотен раз!
Потому что оптимизатор простой код сумел многократно распараллелить.

Очень хотелось бы поверить. Но слишком много неизвестных - какой был компилятор (сейчас компиляторы совершенствуются), каков Ваш уровень мастерства как С++ программиста, каков уровень как С программиста, в каком конкретно месте была потеря скорости?

Вот пример, который привел Александр, хороший с точки зрения проверки С vs C++, т.к. хорошо переводится на С++.

Сообщение отредактировал Slash - Nov 28 2014, 16:31
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Nov 28 2014, 16:15
Сообщение #48


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Стоит отметить, что хоть range-based for и является мощным и удобным инструментом, он, как и все остальное в C++, не работает на Святом Духе, как могут считать некоторые представители педагогического состава нашей страны. range-based for неявно вызывает у контейнера методы begin() и end(), которые возвращают, в свою очередь, привычные нам итераторы.


неплохо... то есть вместо for(int i=0;i<n;i++) зафигачили трудночитаемую конструкцию, которая при этом еще работает через одно место множа вызовы.

Есть интересные нововведения 11 стандарта, но часть из них для борьбы с разросшимися шаблонами, и их не стоит применять для разработки железа. А именно этот пример читабельность не улучшает, и скорость не увеличивает... так что это ради понтов не более....


однако грустный момент, как соответствовать то? Стандарты выходят быстрее продуктов...

Цитата
Углубляясь в историю, стоит отметить, что auto переменные были и раньше, до принятия стандарта C++11. Вот только значение они имели другое. Под auto подразумевался спецификатор хранения переменной. То есть, auto находился в одном ряду с register, static, extern, и указывал на то, что переменная имеет локальное время жизни. Об этом почти не знают начинающие, так как любая переменная объявленная в некотором блоке неявно определяется как auto.


прикольно, я начинающий%).... я про авто не сном не духом, что-то в моих книжках про них авторы не упомянулиsad.gif

Цитата
А не нужно туда заглядывать.
Задач, где нужна оптимальность кода, не так много. Чаще пишется обычный, не критичный ко времени исполнения код, развесистая логика. Тут важнее читабельность исходников. И не только для автора.
Разговоры "я пишу один и мне все понятно" в пользу бедных.


верно для компьютеров не верно для железа, все таки пока еще такты считаем, хочется чтобы схема и реагировала побыстрее и дел делала побольше.
Про читабельность, я пишу на С# и там часто использую foreach, но в данном конкретном случае этот аналог - for читабельность не увеличил, по мне даже уменьшил ссылками и прочим...
Go to the top of the page
 
+Quote Post
jcxz
сообщение Nov 28 2014, 16:26
Сообщение #49


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Slash @ Nov 28 2014, 22:07) *
Очень хотелось бы поверить. Но слишком много неизвестных - какой был компилятор (сейчас компиляторы совершенствуются), каков Ваш уровень мастерства как С++ программиста, каков уровень как С программиста, в каком конкретно месте была потеря скорости?

Компилятор - CCS, cgtools - довольно свежие. И дело не в компиляторе.
Плюсовой код порождал множественные вызовы функций, что страшное зло для DSP-циклов, плюс - как я понимаю из-за сложности для оптимизатора, он не мог правильно рассчитать кол-во проходов циклов, распараллелить обработку так как не мог просчитать зависимости переменных друг от друга и т.п.
Потеря была во всех критичных местах - фильтрах, обработках массивов сэмплов и т.д.. Остальные места меня не интересовали.

Цитата(Slash @ Nov 28 2014, 22:07) *
Задач, где нужна оптимальность кода, не так много. Чаще пишется обычный, не критичный ко времени исполнения код, развесистая логика. Тут важнее читабельность исходников. И не только для автора.

Мы вообще-то находимся в области embedded, где и размер кода и скорость его выполнения всегда будут важны, так как при улучшении этих показателей, позволяют впихнуть приложение в менее мощный, а значит - более дешёвый МК.
Go to the top of the page
 
+Quote Post
psL
сообщение Nov 28 2014, 22:41
Сообщение #50


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390



Цитата(AlexandrY @ Nov 28 2014, 14:58) *
Вопрос был как сохранить контекст, а не где его хранить!
Для более сложных задач нужно применять минимум кооперативную многозадачность.

Разве как и где не взаимосвязаны? Очевидно, что данные сохраняются по указателю в структуре данных задачи. И это разжевывать не нужно.
Для "минимум коопертивной многозадачности" задача как раз таки вырождается в машину состояния. Для примера можно, например, посмотреть выход с препроцессора для protothreads


Цитата(Slash @ Nov 28 2014, 17:38) *
Извините, но это жесть что влезаю из топика "С vs C++", но этот код можно сделать еще лучше.

Непонятен смысл рефакторинга указателей. Мало того, что массив превращается в контейнер, так еще указатели превращаются в объекты с перегруженным operator []. Ради чего это сделано? Кто и кому будет кидать исключение для .at() на микроконтроллере? Или все это ради for на наборе? Как-то избыточно.
Go to the top of the page
 
+Quote Post
yanvasiij
сообщение Dec 1 2014, 07:29
Сообщение #51


Местный
***

Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041



Чтобы внести конкретики. Зачем мне это надо и почему не RTOS: нужно написать библиотеку, которую можно будет помещать, в тело задачи, а можно просто в суперлупе. Не заталкивать же в библиотеку, RTOSину, если есть необходимость в многопоточности. Классическое решение, конечно, это автоматы состояний. Но по ходу обсуждений, выяснилось, что вариаций на эту тему, причем очень интересных в том числе, очень много. Я думал, и еще не совсем отказался от этой затеи - разбираюсь, попробовать отгрузку контекста таким же механизмом как в RTOS, но тогда возникают трудности с кроссплатформенностью. Но при этом все предложения в области автоматов мне тоже интересны, спасибо всем кто делится своим опытом на эту тему.
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 1 2014, 07:55
Сообщение #52


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(yanvasiij @ Dec 1 2014, 10:29) *
Зачем мне это надо и почему не RTOS: нужно написать библиотеку, которую можно будет помещать, в тело задачи, а можно просто в суперлупе.

Кстати, в lwip решена ровно эта задача. Всё может работать без оси. Ось нужна только для sockets API, и то только потому, что это самое sockets API предполагает наличие оси.
Go to the top of the page
 
+Quote Post
yanvasiij
сообщение Dec 1 2014, 08:12
Сообщение #53


Местный
***

Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041



Цитата(scifi @ Dec 1 2014, 12:55) *
Кстати, в lwip решена ровно эта задача. Всё может работать без оси. Ось нужна только для sockets API, и то только потому, что это самое sockets API предполагает наличие оси.

На автоматах?
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 1 2014, 09:01
Сообщение #54


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(yanvasiij @ Dec 1 2014, 11:12) *
На автоматах?

Да.
Go to the top of the page
 
+Quote Post

4 страниц V  « < 2 3 4
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 16:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.0144 секунд с 7
ELECTRONIX ©2004-2016