gpt4 book ai didi

c# - RichTextBox 中的 TextRange 构造函数性能

转载 作者:太空宇宙 更新时间:2023-11-03 13:57:34 25 4
gpt4 key购买 nike

我目前正在从事语法高亮和代码完成项目,并基于 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 是只读的,但是有一个公共(public)方法 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 没有公共(public)空构造函数和 TextPointer 根本没有公共(public)构造函数。您可以在类构造函数中使用一些虚拟值来创建它以避免此检查。)

上面,我说了'如果它真的是构造函数'。显然,您正确完成的分析已经突出显示了构造函数,但它可以很容易地成为构造函数和 Select 方法共有的例程。

假设您不从多个线程调用 colorInterval,我会说这是一种比您目前节省的时间更好的方法,因为(我猜) colorInterval 被频繁调用,不断创建和垃圾收集它留下的后续 TextRange 对象肯定是低效率的。

提出这个建议后,我强烈建议您放弃每次要对(例如)单个字符更改使用react时扫描整个文档的模型。假设您的目标是 >= .net 3.5,RichTextBox 提供了一个 TextChanged 事件,该事件报告了一个 TextChange 对象列表,您可以从中计算出位置(以及添加或删除的字符)更改。

当然,这里会有一些工作,因为任何更改都不太可能完全封装突出显示的范围。 TextRange 类有一个方法可以找到可以找到范围开始和结束的段落,以防有帮助。可能需要存储每个突出显示范围的详细信息,以便您可以快速检查交叉点。

关于c# - RichTextBox 中的 TextRange 构造函数性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11648272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com