这将是一篇很长的文章。如果对我正在遵循的程序有任何建议,我想提出建议。我想要最好的方法来打印 Richtextbox 中每个 CRLF 终止行旁边的行号。我正在使用 C# 和 .NET。我尝试过使用 ListView 但当行数增加时效率很低。我已经成功地在自定义控件中使用图形来打印行号,到目前为止我对性能感到满意。
但当行数增长到 50K 到 100K 时,滚动会受到严重影响。我已经重写了 WndProc 方法并处理所有消息以仅在需要时调用行号打印。 (重写 OnContentsResized 和 OnVScroll 会对打印方法进行冗余调用)。
现在,当行数很小(例如最多 10K)时,行号打印就可以了(我对此很好,因为很少需要编辑 10000 行的文件),但我想删除该限制。
很少的观察
- richtexbox 中显示的行数是常数 +-1。因此,性能差异应该是由于文本较大,而不是因为我使用图形绘画。
- 与小文件相比,为大文本绘制行号的速度较慢
现在是伪代码
FIRST_LINE_NUMBER = _textBox.GetFirstVisibleLineNumber();
LAST_LINE_NUMBER = _textBox.GetLastVisibleLineNUmber();
for(loop_from_first_to_last_line_number)
{
Y = _textBox.GetYPositionOfLineNumber(current_line_number);
graphics_paint_line_number(current_line_number, Y);
}
我在用从位置获取字符索引并循环遍历 RichTextBox.Lines 以在获取行号的两个函数中查找行号。为了获得 Y 位置,我正在使用从字符索引获取位置得到Point结构。
上述所有 RichTextBox 方法似乎都是 O(n),这会消耗性能。 (如果我错了请纠正我。)
我决定使用二叉树来存储行号,以提高通过字符索引搜索行号时的搜索性能。我有一个想法,得到一个需要 O(n) 构建时间、O(nlgn) 最坏情况更新和 O(lgn) 搜索的数据结构。
这种方法值得付出努力吗?
还有其他方法可以解决问题吗?如果需要,我准备从头开始编写控件,我只是希望它轻量且快速。
在决定最佳前进方式之前,我们需要确保我们了解瓶颈。
首先,了解 RichTextbox(我假设您正在使用它)如何处理大文件非常重要。因此,我建议删除所有行打印内容,看看它在大文本上的表现如何。如果很穷,那就是你的问题。
第二步是放置一些分析语句或仅使用分析器(VS 2010 附带的一个)来查找瓶颈。它可能是查找行号的方法,或者其他东西。
此时我只建议更多调查。如果您已完成调查并了解更多信息,请更新您的问题,我会相应地回复您。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)