2010-09-27 13 views
18

Uso CEDET (ultimo CVS) con diversi progetti di dimensioni moderatamente grandi (alcune centinaia di kLOC ciascuno, principalmente C, ma alcuni C++) e talvolta si verificano lunghe pause in cui il sistema non risponde per secondi. Più raramente, gira fuori controllo completamente e devo mescolare su C-g e provare a spostare il cursore o passare a un buffer diverso per ottenere il controllo di ritorno.Consigli di scalabilità CEDET

Io uso GNU Global per creare tag per i progetti con cui lavoro, ma questo è ancora a volte lento, specialmente per semantic-symref-symbol e alcuni salti che sembrano richiedere l'analisi di molte intestazioni e file di origine. In alcuni casi gli errori semantic-ia-fast-jump con il messaggio semantic-ia--fast-jump-helper: Tag SomeFunction has no buffer information anche se gtags-find-tag lo trovano immediatamente (nello stesso progetto), anche se forse in una posizione non aggiornata; questo può essere un bug temporaneo, di solito semantic-ia-fast-jump è affidabile.

Gradirei qualche suggerimento su come

  • Throttle CEDET senza perdere tutte le analisi semantica.
  • Scopri cosa ha causato il CEDET fuori controllo, così posso correggere le definizioni del mio progetto o presentare una segnalazione di bug.
  • Determinare il motivo per cui alcune analisi semantiche non riescono.
  • Ottieni semantico per memorizzare più informazioni in modo da renderlo più reattivo, ho molta memoria che mi piacerebbe usare.
  • Gestisci GNU globale (crea e mantieni aggiornato) per più progetti in diversi luoghi, incluse le directory di sistema.
  • Gestire le dipendenze tra i progetti che ho configurato con ede-cpp-root-project.
  • Gestire i progetti con più configurazioni di compilazione, ciascuna con il proprio "config.h" e la directory di compilazione.

ci sono alcuni suggerimenti nell'articolo http://alexott.net/en/writings/emacs-devenv/EmacsCedet.html, sto cercando qualcosa al di là di tale articolo.

risposta

20

Gli strumenti CEDET che si utilizzano sono limitati dalla capacità di Emacs di tracciare tutti i simboli dell'intero progetto. Un buon punto di partenza per limitare ciò che CEDET/Semantic fa è tramite semanticdb-find-default-throttle. Se sai come è organizzato il tuo progetto, puoi disabilitare alcuni tipi di ricerche per velocizzare le cose.

CEDET analizzerà molti file di cui pensi possa essere necessario e che riempirà anche la memoria. In tal caso, è possibile personalizzare semantic-idle-scheduler-max-buffer-size per disabilitare l'analisi di file di grandi dimensioni, semantic-idle-work-parse-neighboring-files-flag per disabilitare l'analisi di elementi locali casuali e `semantic-idle-work-update-headers-flag 'per disabilitare le intestazioni di analisi. Notare che l'ultimo 2 è impostato su zero, ma è abilitato da alcune delle funzioni di impostazione automatica.

CEDET/Semantic memorizzerà nella cache molti dati in memoria e costruisce tabelle di ricerca ordinate per migliorare le prestazioni. Se scopri che stai modificando molto i file di intestazione, quelle modifiche fanno sì che le cache non siano più aggiornate e le costringono a ricostruire. Se esci e riavvii Emacs molto, allora questo costringe Semantic a ricaricare grandi tabelle di database.

Un'altra possibilità è impostare semanticdb-persistent-path per elencare solo le directory di cui si cura molto. Questo ridurrà i dati salvati, che non verranno ricaricati. Se è necessario, eseguirà l'analisi come necessario, ma contribuirà a mantenere bassi i dati totali.

È inoltre possibile utilizzare semantic--before-fetch-tags-hook per una funzione che restituisce nulla in varie condizioni.Trova i file che richiedono molto tempo per essere analizzati a causa delle dimensioni, della latenza di rete o di qualsiasi altra cosa e impostarli per non analizzarli mai. Anche questo farà risparmiare un po 'di tempo.

L'utilizzo di GNU Global è un buon modo per velocizzare le cose. Usandolo con semantico symref, i file in cui trova gli hit vengono analizzati per fornire i dati necessari per la visualizzazione dell'output. Non c'è molto da fare al riguardo.

Per l'errore trovato sopra, se è possibile identificare un modo per riprodurlo, si prega di condividerlo sulla mailing list cedet-devel in modo che possa essere corretto. Questo tipo di bug è apparso in precedenza, di solito quando il tag GNU Global non riesce a convertire in un tag buffer.

Per eseguire il debug di CEDET fuori controllo, utilizzare semantic-debug-idle-function e semantic-debug-idle-work-function per restringere le cose. Vedi sopra su qualche configurazione lì.

È possibile utilizzare cedet-gnu-global-create/update-database per aggiornare un database o aggiungerlo a un gancio. Non penso che sia già entrato nel doc.

La gestione del progetto è complicata. La maggior parte dei progetti integrati fa bene alle piccole cose. Progetti particolarmente grandi con sistemi di costruzione personalizzati di solito garantiscono un tipo di progetto EDE personalizzato. Creare nuovi progetti non è male. Se guardi in ede-linux o ede-emacs puoi prendere le basi. Nel tuo progetto personalizzato, puoi racchiudere tutti i progetti correlati e sovrascrivere funzioni come macro, includere directory e comandi di compilazione. Ho dovuto scrivere anche un progetto personalizzato per il mio lavoro. Era molto simile a ede-linux con cose uniche su cui lavoro.