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ì?
Đây có phải là WinForms không? –
Ồ vâng, quên đề cập đến điều đó. Vâng, đúng vậy. –
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