我正在一个.net windows窗体应用程序的文本框中写一个日志,里面有很多很多格式化的文本。一旦数据超过几兆,它就很慢。因为我每次都要追加字符串,所以每次都要重新分配,对吗?我只需要将值设置到文本框一次,但在我的代码中,我做了成千上万次line+=data。有没有更快的方法?也许是不同的控件?有没有我可以使用的链接列表字符串类型?
line+=data
hiz5n14c1#
如果文本框是增量添加的,例如日志输出,StringBuilder将不会提供帮助。但是,如果以上是真的,并且如果你的更新足够频繁,那么你可能应该缓存一些更新,然后一步就把它们附加上去(而不是不断地附加)。这将保存你很多字符串重新分配......然后StringBuilder会很有帮助。备注:1.建立类别范围的StringBuilder成员(_sb)1.启动计时器(或使用计数器)1.将文本更新附加到_sb1.当计时器滴答作响或达到某个计数器时,重置并附加到文本框1.从#1重新启动过程
vmjh9lq92#
还没有人提到虚拟化,这是为海量数据提供可预测性能的唯一方法。一旦日志变得足够大,即使使用StringBuilder并每半秒将其转换为字符串也会 * 非常 * 慢。通过数据虚拟化,您只需要在内存中保存必要的数据(即用户可以看到的数据,或者两边都多一点),而其余的数据则存储在磁盘上。旧数据会“滚出”内存,因为新数据会替换它。为了让TextBox * 看起来 * 好像有很多数据,你应该告诉它它有。当用户滚动时,你会用来自底层源的相关数据替换缓冲区中的数据(使用随机文件访问)。这样你的UI将监视一个文件,而不是监听日志事件。当然,这比简单地使用StringBuilder要多得多,但我认为为了以防万一,值得一提。
StringBuilder
TextBox
hiz5n14c3#
使用StringBuilder构建String,然后使用toString()将其转换为String,并将其分配给文本框。
toString()
imzjd6km4#
我发现将文本框的WordWrap属性设置为false * 可以大大 * 提高性能,只要您不介意向右滚动以查看所有文本。在我的例子中,我想将一个20-50 MB的文件粘贴到多行文本框中,以便对其进行一些处理。打开WordWrap时,这需要几分钟,而关闭WordWrap时只需几秒钟。
4条答案
按热度按时间hiz5n14c1#
如果文本框是增量添加的,例如日志输出,StringBuilder将不会提供帮助。
但是,如果以上是真的,并且如果你的更新足够频繁,那么你可能应该缓存一些更新,然后一步就把它们附加上去(而不是不断地附加)。这将保存你很多字符串重新分配......然后StringBuilder会很有帮助。
备注:
1.建立类别范围的StringBuilder成员(_sb)
1.启动计时器(或使用计数器)
1.将文本更新附加到_sb
1.当计时器滴答作响或达到某个计数器时,重置并附加到文本框
1.从#1重新启动过程
vmjh9lq92#
还没有人提到虚拟化,这是为海量数据提供可预测性能的唯一方法。一旦日志变得足够大,即使使用
StringBuilder
并每半秒将其转换为字符串也会 * 非常 * 慢。通过数据虚拟化,您只需要在内存中保存必要的数据(即用户可以看到的数据,或者两边都多一点),而其余的数据则存储在磁盘上。旧数据会“滚出”内存,因为新数据会替换它。
为了让
TextBox
* 看起来 * 好像有很多数据,你应该告诉它它有。当用户滚动时,你会用来自底层源的相关数据替换缓冲区中的数据(使用随机文件访问)。这样你的UI将监视一个文件,而不是监听日志事件。当然,这比简单地使用
StringBuilder
要多得多,但我认为为了以防万一,值得一提。hiz5n14c3#
使用
StringBuilder
构建String,然后使用toString()
将其转换为String,并将其分配给文本框。imzjd6km4#
我发现将文本框的WordWrap属性设置为false * 可以大大 * 提高性能,只要您不介意向右滚动以查看所有文本。在我的例子中,我想将一个20-50 MB的文件粘贴到多行文本框中,以便对其进行一些处理。打开WordWrap时,这需要几分钟,而关闭WordWrap时只需几秒钟。