2015-05-11 3 views
7

У меня есть RichTextBox, и как только пользователь загружает файл, моя программа переходит к сканированию всего файла, чтобы изменить цвет определенных слов. Вот мой код:Синтаксис Выявление проблем производительности

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(); 

Проблема: мой код занимает около 5 с половиной секунд для сканирования и изменений цвета всех ключевых слов в файле, который имеет 200000 символов.

Я уже говорил ранее, что не следует использовать Regex для такого рода вещи, но после того, как делать несколько тестов, я понял, что: MatchCollection matches = cKeyWords.Matches(programTextBox.Text);

только занимает около 0.1s и удаление

programTextBox.SelectionColor = Color.Blue; 

сокращает общее время выполнения моего кода от 5.5s до примерно 0.3с

Как? Зачем? И самое главное: что я могу сделать?

+0

Это WinForms? –

+0

О да, забыл упомянуть об этом. Да. –

+1

RichTextBox не особенно эффективен. Вы можете попробовать применить подсветку синтаксиса, создав RTF самостоятельно: [rtf spec] (https://www.microsoft.com/en-nz/download/details.aspx?id=10725) , Назначьте результат свойству ['Rtf'] (https://msdn.microsoft.com/en-us/library/system.windows.forms.richtextbox.rtf.aspx) текстового поля. – Blorgbeard

ответ

0

Вы попробовали this?

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

0

Вместо того, чтобы выделять синтаксис самостоятельно, попробуйте использовать редактор подсветки синтаксиса для среды разработки SharpDevelop ICSharpCode.TextEditor.

+0

, пожалуйста, напишите ответ, а затем ссылки. – Sachith