2012-03-02 3 views
2

В моем встроенном приложении, которое очень чувствительно к памяти, я заметил некоторые из функций newlib, используя много пространства стека. Посмотрев исходный код newlib, в частности memmem.c, в этом случае я заметил, что два параметра: PREFER_SIZE_OVER_SPEED и __OPTIMIZE_SIZE__, что может значительно сократить использование памяти. Насколько я понимаю, они должны быть определены при компиляции newlib, чтобы использовать библиотеки «оптимизированного для размера». Поскольку я использую микроконтроллер cortex-M3, есть ли какие-либо средства ARM, которые используют «оптимизированный для размера» newlib или предоставляют возможность его использования, или я должен сам его создать. Кроме того, при создании newlib, должен ли я также создавать GCC или я могу просто создать библиотеку и использовать ее с помощью текущей инструментальной цепочки. В настоящее время я использую CoIDE с их поставляемой инструментальной цепочкой.Newlib оптимизирован для размера кода

ответ

1

Вам нужна только библиотека, а не компилятор.

Однако я ожидал бы, что любая оптимизация размера будет относиться к размеру кода, а не размер стека. Размер стека будет уменьшен только при уменьшении размера или числа автоматических переменных и, как правило, определяется требуемой функциональностью, а не оптимизацией алгоритма.

Хотя верно, что часто операции высокого уровня, связанные с перемещением больших объемов данных, могут быть ускорены за счет использования большего объема памяти, я бы сказал, что такие возможности минимальны на уровне стандартной библиотеки C, поэтому «предпочитают size over speed "- все о размере кода, а не использовании памяти данных.

+0

Это то, что я заметил, делая то, что Z.T. также предлагается. Я знаю, что оптимизированные флаги размера уменьшают размер кода, а тот факт, что он использует меньше стека для этой конкретной функции, - это просто счастливое совпадение. Но, как я уже сказал в своем комментарии, я задавался вопросом, что еще можно получить от этого, и хочу попробовать его. – Merwe

+0

Я бы сказал, что, чтобы быть уверенным, что вы знаете, как была построена библиотека, вам нужно либо получить эту информацию из (если скрипты сборки включены, что может дать ключ), или создайте его самостоятельно для своих собственных требований. – Clifford

0

Вы используете memmem, который не является стандартной функцией. Это расширение GNU в glibc. Код, который вы на самом деле запускаете, находится в str-two-way.h. Я не изучал его, но он говорит, что это сублинейный поиск по строкам, такой как Бойер-Мур, и указывает на статью Википедии о Бойер-Муре. Конечно, это будет иметь некоторые издержки памяти.

Поскольку это даже не стандартная функция, нет никаких оснований использовать реализацию newlib, если вам это не нравится. Просто используйте свою собственную функцию поиска подстроки. Если вы знаете, что квадратичное время достаточно хорошее, просто используйте 5-строчный цикл из memmem.c в своем собственном коде. Возможно, вам захочется проверить, что memcmp делает правильные действия при невыровненных нагрузках (если ваша архитектура поддерживает их). Если это не так, ручная вложенная петля может быть быстрее, чем вызов memcmp.

+0

Я действительно сделал то, что вы предложили, используя короткую версию кода из memmem.c, но это заставило меня задаться вопросом, нет ли каких-либо других преимуществ от создания newlib с оптимизированными для флажков размера. Я также посмотрел на источник из memmem uClibc, который вообще не использует memcmp. Меня не очень беспокоит производительность, так как я использую только memmem во время фазы инициализации моего приложения, но, как я уже сказал, мне также интересно, что еще можно получить от «меньшего» newlib. – Merwe

+0

Я предлагаю grepping источник для тех, которые определяют и спрашивают в своем списке рассылки, чтобы больше способов сохранить память. :-) –

Смежные вопросы