Цитата(Andy Mozzhevilov @ Oct 17 2005, 14:10)
Цитата(NickS @ Oct 17 2005, 16:02)
Цитата(Andy Mozzhevilov @ Oct 17 2005, 11:59)
Какая разница, сколько там флэш.
Эмпирическая оценка разбухания кода Си по сравнениею с асм 1,3-1,5 раз.
Быстродействия примерно столько же. Кочечно, есть и частные случаи.
Внесу и я свое замечание на 5 копеек.
Вообще-то как я замечал оценка разбухания кода и соответственно быстродействие оличается в 3-4 раза.
Это, мягко говоря, неправда.
Цитата(NickS @ Oct 17 2005, 16:02)
Только сравнивать надо не отдельные функции, а модуль целиком, содержащий большое количество функций.
При увеличении количества функций все лишь нивелируется, стремясь к среднему значению. Если можно еще найти отдельные локальные места, где на асм можно выиграть 3-4 раза объема или быстродействия по сравнению с Ц, то в большом проекте эти места утонут в море среднестатистических показателей.
Судя по всему вы не писали достаточно большие проекты на ASM.
У меня, конечно, довольно редко воникает проект продублированный на С и ASM. Однако, например для кодека G.723.1 переписывание только базовых функций на ASM привело к уменьшению времени обработки одного фрейма с 200мс до 25, что соответствует примерно 10 кратному ускорению времени выполнения. Для обработчика обмена по USB выигрышь по скорости обработки выросло в 4 раза.
И как раз чем бльше проект, тем заметнее разница.
Если на отдельных простых функциях разница составляет 30% то на сложных функциях, а уж тем более больших проектах разница достигает 3-4 каратного превосходства.
И чтобы не быть совсем голословным:
Вы предлагали сравнить на реальном проекте.
У меня недавно был проект часть которого также была выполненый на С и ASM.
Это real FFT.
На котором также легко демонстрируется трехкратное превосходство ASM над С.
Итак:
Есть входной масив данных int16 Data[2048];
Так же есть входной оконный масив int16 WIN[2048];
Наебходимо выполнить следующее:
Первоначально поэлементно умножить елемент данных на елемент окна
Data[i]=Data[i]*WIN[i]/65536;
Далее выполнить реальное преобразование фурье по 2048 точкам.
И получить квадкат абсолютного значения по получившимся комплексным отсчетам.
ABS= RE*RE+Im*Im;
Выходной массив это int32 Abs[1024] расположен на месте входного массива данных Data[2048].
пример на ASM прилагаю:
Он занимает 4К памяти данных, и во Flash 4К под окно, 4К под служебные таблицы и совсем чуть-чуть под программы.
Один цикл вычислений занимает примерно 500 000 цикло для 7TDMI.
На С аналогичная программ требовала примерно в 3 раза больше.
Если вы полагаете, что сможете получить аналогичные ( в приделах 30% ) результаты на С, покажите это.
В принципе дело достаточное простое для С.
Умножение на окно и авсолютное значение - функции достаточно простые.
А real FFT предлагается в довольно большом количестве библиотек если лень писать самому.