2015-05-11 19 views
7

Tôi có RichTextBox và khi người dùng tải một tệp, chương trình của tôi sẽ tiến hành quét toàn bộ tệp để thay đổi màu của một số từ nhất định. Đây là mã của tôi:Cú pháp Làm nổi bật vấn đề hiệu suất

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

Vấn đề: mã của tôi mất khoảng 5 giây rưỡi để quét và thay đổi màu của tất cả các từ khóa trong một tệp có 200.000 ký tự.

Tôi đã nói trước rằng tôi không nên sử dụng một Regex cho rằng loại công cụ, nhưng sau khi làm một số xét nghiệm tôi đã tìm ra rằng: MatchCollection matches = cKeyWords.Matches(programTextBox.Text);

chỉ mất khoảng 0.1s và loại bỏ các

programTextBox.SelectionColor = Color.Blue; 

giảm tổng thời gian thực hiện mã của tôi từ 5.5s xuống còn khoảng 0.3s

như thế nào? Tại sao? Và quan trọng nhất: Tôi có thể làm gì?

+0

Đây có phải là WinForms không? –

+0

Ồ vâng, quên đề cập đến điều đó. Vâng, đúng vậy. –

+1

RichTextBox không đặc biệt hiệu quả .. Bạn có thể thử áp dụng cú pháp tô sáng bằng cách tự xây dựng RTF: [rtf spec] (https://www.microsoft.com/en-nz/download/details.aspx?id=10725) . Gán kết quả cho thuộc tính ['Rtf'] (https://msdn.microsoft.com/en-us/library/system.windows.forms.richtextbox.rtf.aspx) của hộp văn bản. – Blorgbeard

Trả lời

0

Bạn đã thử this?

Điều này chặn hình ảnh và thực sự có vẻ như chặn nó đúng cách. Tôi chỉ có một tệp thử nghiệm nhỏ để đưa vào nó, nhưng nó dường như hoạt động khá tốt.

0

Thay vì tự làm nổi bật cú pháp, hãy thử sử dụng ICSharpCode.TextEditor, trình chỉnh sửa đánh dấu cú pháp cho IDE SharpDevelop.

+0

vui lòng đăng câu trả lời và sau đó tham khảo. – Sachith

Các vấn đề liên quan