簡體   English   中英

RichTextBox中TextRange構造函數的性能

[英]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屬性的StartEnd是只讀的,但是有一個公共方法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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM