Советы по масштабируемости CEDET - PullRequest
18 голосов
/ 27 сентября 2010

Я использую 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, Я ищу что-нибудь кроме этой статьи.

1 Ответ

20 голосов
/ 28 сентября 2010

Используемые вами инструменты 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 значения по умолчанию равны nil, но они включены некоторыми функциями автоматической настройки.

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

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

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

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

Если вы нашли ошибку, указанную выше, если вы можете определить способ ее воспроизведения, сообщите о ней в списке рассылки 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 с вещами, уникальными для того места, где я работаю.

...