2015-05-11 11 views
7

Possiedo un RichTextBox e una volta che l'utente carica un file, il mio programma procede alla scansione dell'intero file per modificare il colore di alcune parole. Ecco il mio codice:Sintassi Evento di prestazioni

static Regex cKeyWords = new Regex(@"\b(?=[a-gilr-w])(?: 
    s(?:hort|i(?:gned|zeof)|t(?:atic|ruct)|witch) | c(?:ase|har|on(?:st|tinue)) | 
    e(?:lse|num|xtern) | i(?:f|nt) | f(?:loat|or) | d(?:o|efault|ouble) | un(?:ion|signed) | 
    re(?:gister|turn) | vo(?:id|latile) | while | break | long | typedef | auto | goto 
    )\b", 
    RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace); 

... 

programTextBox.Enabled = false; 
int selectStart = this.programTextBox.SelectionStart; 
programTextBox.SuspendLayout(); 
MatchCollection matches = cKeyWords.Matches(programTextBox.Text); 
foreach (Match match in matches) 
{ 
    if (match.Index == 0) 
     programTextBox.Select(match.Index, match.Length/* - 1*/); 
    else 
     programTextBox.Select(match.Index + 1, match.Length - 1); 
    programTextBox.SelectionColor = Color.Blue; 
} 
programTextBox.Select(selectStart, 0); 
programTextBox.SelectionColor = Color.Black; 
programTextBox.Enabled = true; 
programTextBox.ResumeLayout(); 

Problema: il mio codice dura circa 5 secondi e mezzo per esplorare e modificare i colori di tutte le parole chiave in un file che ha 200.000 caratteri.

mi è stato detto prima che non dovrei utilizzare un Regex per questo genere di cose, ma dopo aver fatto varie prove ho capito che il: MatchCollection matches = cKeyWords.Matches(programTextBox.Text);

vogliono solo circa 0.1s e la rimozione della

programTextBox.SelectionColor = Color.Blue; 

riduce il tempo totale di esecuzione del mio codice da 5.5s a circa 0,3 s

Come? Perché? E soprattutto: cosa posso fare?

+0

È questo WinForms? –

+0

Oh sì, ho dimenticato di dirlo. Sì. –

+1

RichTextBox non è particolarmente efficiente .. Potresti provare ad applicare l'evidenziazione della sintassi creando autonomamente l'RTF: [rtf spec] (https://www.microsoft.com/en-nz/download/details.aspx?id=10725) . Assegna il risultato alla proprietà ['Rtf'] (https://msdn.microsoft.com/en-us/library/system.windows.forms.richtextbox.rtf.aspx) della casella di testo. – Blorgbeard

risposta

0

Hai provato this?

Questo blocca di dipingere e in effetti sembra bloccarlo correttamente. Avevo solo un piccolo file di test per passarlo, ma sembrava funzionare abbastanza bene.

0

Invece di fare l'evidenziazione della sintassi, provare a utilizzare ICSharpCode.TextEditor, l'editor di evidenziazione della sintassi per l'IDE SharpDevelop.

+0

per favore posta risposta e quindi riferimenti. – Sachith