作者:好好_haohao_100 | 来源:互联网 | 2023-09-07 14:36
这将是一个很长的帖子.如果有任何关于我正在遵循的程序,我想提出建议.我想要最好的方法在richtextbox中的每个CRLF终止行旁边打印行号.我正在使用C#和.NET.我尝试过使
这将是一个很长的帖子.如果有任何关于我正在遵循的程序,我想提出建议.我想要最好的方法在richtextbox中的每个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)搜索.
这种方法值得付出努力吗?
有没有其他方法可以解决这个问题?如果需要,我准备从头开始编写控件,我只是希望它重量轻,速度快.
解决方法:
在决定最佳前进方向之前,我们需要确保了解瓶颈.
首先,重要的是要知道RichTextbox(我假设您正在使用它如何提到)处理大文件.所以我建议删除所有行打印的内容,看看它是如何用大文本执行的.如果它很差,那就有你的问题.
第二步是放置一些分析语句或只使用分析器(一个VS 2010附带)来找到瓶颈.它可能会成为查找行号或其他内容的方法.
在这一点上,我只会建议更多的调查.如果您已完成调查并获得更多信息,请更新您的问题,我会相应地回复您.