[英]TextRange constructor performance in RichTextBox
我目前正在從事語法突出顯示和代碼完成項目,並基於RichTextBox進行用戶控制。 我在適應RTB的工作方式和所有問題時遇到了一些問題,但是我設法進行了簡單的語法突出顯示。
簡單意味着每次用戶鍵入字符時,我都會突出顯示整個文本。 它不應該是快速的或任何東西,但是它太慢了 。 當我有大約500個字符的文本時,就會出現性能問題,並且對於每個鍵入的字符,我只對文本進行一次遍歷(“ colorInterval”函數在一次遍歷中被調用了約100次)。
性能分析說,問題是TextRange構造函數需要大約80%以上的時間,並且每次需要為文本間隔上色時,都會使用它:
private void colorInterval(TextPointer start, TextPointer end)
{
TextRange range = new TextRange(start, end);
if(isFunction(range.Text)) colorAsFunction(range);
if(isInQuotes(range.Text)) colorAsQuoted(range);
...
}
所以這是我的問題 :
我是否以這種方式做任何事情都是錯誤的,還是有辦法提高TextRange的性能,回收“范圍”對象或類似的東西? 還有什么其他解決方案。
最簡單的方法是(如您建議的那樣)重用TextRange
對象,如果它確實是占用大部分時間的構造函數。 TextRange
屬性的Start
和End
是只讀的,但是有一個公共方法Select
可以同時更新這兩個方法,就像您一直在使用的構造方法一樣,使用兩個TextPointer
對象。
protected TextRange range;
private void colorInterval(TextPointer start, TextPointer end)
{
if (range == null)
range = new TextRange(start, end);
else
range.Select(start, end);
...
}
(注:在決定是否初始化變量之前檢查空引用並不像在聲明中實例化TextRange
那樣整潔。不幸的是, TextRange
沒有公共的空構造函數,而TextPointer
沒有公共的構造函數。您可以使用一些方法來創建它類構造函數中的虛擬值,以避免此檢查。)
在上面,我說過“如果真的是構造函數”。 顯然,您正確完成的概要分析突出了構造函數,但它很容易成為構造函數和Select
方法的通用例程。
假設您不從多個線程中調用colorInterval
,那么我想說這是一種比您目前節省時間的方法更好的方法,因為(我猜想) colorInterval
被頻繁調用,並且常量的創建和垃圾回收它留下的后續TextRange
對象肯定是效率低下的。
提出此建議后,我強烈建議您離開要在每次要對(例如)單個字符更改做出反應時掃描整個文檔的模型。 假設您的目標是> = .net 3.5, RichTextBox
提供一個TextChanged
事件,該事件報告一個TextChange
對象列表,您可以從中確定更改的位置(以及更改所添加或刪除的字符)。
當然,這里會有一些工作,因為任何更改都不太可能完全封裝突出顯示的范圍。 TextRange
類具有一種查找段落的方法,如果有幫助,可以在其中找到范圍的開始和結束。 可能需要存儲每個突出顯示范圍的詳細信息,以便您可以快速檢查交叉點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.