【发布时间】:2010-10-06 11:27:06
【问题描述】:
这将是一个很长的帖子。如果对我正在遵循的程序有任何建议,我想提出建议。我想要最好的方法来打印富文本框中每个 CRLF 终止行旁边的行号。我正在将 C# 与 .NET 一起使用。我曾尝试使用 ListView 但当行数增加时效率低下。我已经成功地在自定义控件中使用 Graphics 来打印行号,到目前为止我对性能感到满意。
但是随着行数增加到 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);
}
我正在使用 GetCharIndexFromPosition 并遍历 RichTextBox.Lines 以在两个获取行号的函数中查找行号。为了获得 Y 位置,我使用 GetPositionFromCharIndex 来获取 Point 结构。
上面所有的 RichTextBox 方法似乎都是 O(n),这会消耗性能。 (如果我错了,请纠正我。)
我决定使用二叉树来存储行号,以提高通过 char 索引搜索行号时的搜索性能。我想获得一个需要 O(n) 构建时间、O(nlgn) 最坏情况更新和 O(lgn) 搜索的数据结构。
这种方法值得努力吗? 有没有其他方法可以解决这个问题?如果需要,我准备从头开始编写控件,我只希望它轻巧且快速。
【问题讨论】:
标签: c# .net optimization richtextbox