Советы по масштабируемости CEDET

Я использую CEDET (последняя версия CVS) с несколькими умеренно большими проектами (несколько сотен kLOC в каждом, в основном C, но немного C ++) и иногда наблюдаю длинные паузы, в которых система полностью не отвечает на несколько секунд. Реже он полностью выходит из-под контроля, и мне приходится нажимать C-g и пытаться переместить курсор или переключиться на другой буфер, чтобы вернуть контроль.

Я использую GNU Global для создания тегов для проектов, над которыми работаю, но иногда это все равно медленное, особенно для semantic-symref-symbol и некоторых переходов, которые, кажется, требуют синтаксического анализа большого количества заголовков и исходных файлов. В некоторых случаях semantic-ia-fast-jump ошибки с сообщением semantic-ia--fast-jump-helper: Tag SomeFunction has no buffer information, даже если gtags-find-tag находит его немедленно (в том же проекте), хотя, возможно, в устаревшем месте; это может быть временная ошибка, обычно semantic-ia-fast-jump надежен.

Буду признателен за любые предложения о том, как

  • Дросселируйте CEDET, не теряя семантического анализа.
  • Узнайте, что привело к выходу CEDET из-под контроля, чтобы я мог исправить определения своего проекта или отправить отчет об ошибке.
  • Определите, почему какой-то семантический анализ дает сбой.
  • Получите семантику, чтобы кэшировать больше информации, чтобы сделать ее более отзывчивой, у меня много памяти, которую я хотел бы использовать.
  • Управляйте GNU Global (создавайте и поддерживайте актуальность) для множества проектов в разных местах, включая системные каталоги.
  • Управляйте зависимостями между проектами, которые я настроил с помощью ede-cpp-root-project.
  • Управляйте проектами, имеющими несколько конфигураций сборки, каждая из которых имеет свой «config.h» и каталог сборки.

В статье http://alexott.net/en/writings/emacs-devenv/EmacsCedet.html, я ищу что-нибудь помимо этой статьи.


person Jed    schedule 27.09.2010    source источник


Ответы (1)


Инструменты CEDET, которые вы используете, ограничены способностью Emacs отслеживать каждый символ во всем вашем проекте. Хорошей отправной точкой для регулирования того, что делает CEDET / Semantic, является semanticdb-find-default-throttle. Если вы знаете, как организован ваш проект, вы можете отключить некоторые виды поиска, чтобы ускорить работу.

CEDET проанализирует множество файлов, которые, по его мнению, могут вам понадобиться, которые также заполнят память. В этом случае вы можете настроить semantic-idle-scheduler-max-buffer-size, чтобы отключить синтаксический анализ больших файлов, semantic-idle-work-parse-neighboring-files-flag, чтобы отключить анализ случайного соседнего материала, и флаг «semantic-idle-work-update-headers-flag», чтобы отключить синтаксический анализ заголовков. Обратите внимание, что последние 2 значения по умолчанию равны нулю, но они включены некоторыми функциями автоматической настройки.

CEDET / Semantic будет кэшировать много данных в памяти и создавать отсортированные таблицы поиска для повышения производительности. Если вы обнаружите, что много редактируете файлы заголовков, эти изменения приводят к тому, что кеши устаревают и вынуждают их перестраивать. Если вы выйдете из Emacs и перезапустите его много раз, то это заставит Semantic перезагружать большие таблицы базы данных.

Другая возможность - установить semanticdb-persistent-path, чтобы отображались только те каталоги, которые вам очень дороги. Это сократит количество сохраненных данных, которые не будут перезагружены. Если это необходимо, он будет повторно анализироваться по мере необходимости, но это поможет уменьшить общие данные.

Вы также можете использовать semantic--before-fetch-tags-hook для функции, которая возвращает ноль при различных условиях. Найдите файлы, для анализа которых требуется много времени из-за размера, задержки в сети или чего-то еще, и настройте их так, чтобы никогда не анализировать. Это тоже сэкономит время.

Использование GNU Global - хороший способ ускорить процесс. Использование его с семантической символической ссылкой приведет к тому, что файлы, в которых он находит совпадения, будут проанализированы, чтобы предоставить требуемые данные для вывода на экран. С этим особо не поделаешь.

Что касается ошибки, которую вы обнаружили выше, если вы можете определить способ ее воспроизведения, поделитесь ею в списке рассылки cedet-devel, чтобы ее можно было исправить. Этот тип ошибки обнаруживался раньше, обычно когда глобальный тег GNU не может преобразоваться в тег буфера.

Чтобы отладить выход CEDET из-под контроля, используйте semantic-debug-idle-function и semantic-debug-idle-work-function, чтобы сузить круг вопросов. См. Выше о некоторых конфигурациях.

Вы можете использовать cedet-gnu-global-create/update-database для обновления базы данных или добавить ее в ловушку. Я не думаю, что это вошло в документ.

Управление проектами - непростая задача. Большинство встроенных проектов подходят для мелочей. Особо большие проекты с настраиваемыми системами сборки обычно требуют настраиваемого типа проекта EDE. Создание новых проектов не так уж и плохо. Если вы посмотрите в ede-linux или ede-emacs, вы поймете основы. В пользовательском проекте вы можете заключить все связанные проекты и переопределить такие функции, как макросы, включить каталоги и команды компиляции. Мне также пришлось написать индивидуальный проект для моей работы. Он был очень похож на ede-linux с уникальными особенностями того места, где я работаю.

person Eric    schedule 28.09.2010