我的应用程序需要解析一些大的字符串数据。这意味着我大量使用字符串类的Split,IndexOf和SubString方法。我试图使用StringBuilder类,我必须做任何串联。但是,当应用程序执行此解析时,应用程序CPU使用率很高(60-70%)。我猜测调用这些字符串API会导致CPU使用率变高,特别是数据大小很大(典型字符串长度为400K)。任何想法如何验证是什么导致CPU使用率如此之高以及是否有任何关于如何降低CPU使用率的建议?
答案 0 :(得分:2)
要检查的一件事是你尽可能多地传递StringBuilder,而不是创建一个新的,然后不必要地返回它的ToString()。
如果您将数据处理为较小的字符串,从流中读取,则可以获得更大的收益。当然,这取决于你正在做什么样的操作,但是如果可能的话,从小块中读取StreamReader(或类似的源,取决于源)的数据,然后将其写入StreamWriter。
通常,更改仅适用于给定的文本行,这使得以下模式立即有用:
using(StreamReader sr = new StreamReader(sourceInfo))
using(StreamWriter sw = new StreamWriter(destInfo))
for(string line = sr.ReadLine(); line != null; line = sr.ReadLine())
sw.WriteLine(ManipulateString(line));
在其他不适用的情况下,仍然有办法对要处理的字符串进行分块。
答案 1 :(得分:2)
要了解CPU使用率的来源:请参阅What Are Some Good .NET Profilers?
减少CPU使用率:当然,这取决于实际花费的时间。例如,您可能会考虑不使用实际的子串,而是使用很少的对象编码它们来自它们的大字符串。 (不能保证这实际上会有所改进。)很可能,当你对代码进行分析时,会有一些东西会突然出现在你身上;它们可能是你从未猜到过的东西,只要你知道它们需要修复它们就很容易修复。
答案 2 :(得分:1)
如果您的解析器不需要进行反向跟踪,那么Jon的回答也是如此,即它总是向前读取sting并且字符串的源不是文件/网络流,您可以使用{{1只需将您的String包装在StreamReader
中,例如
StringReader