2011-03-21 178 views
2

我的应用程序需要解析一些大字符串数据。这意味着我大量使用字符串类的Split,IndexOf和SubString方法。我试图使用StringBuilder类无论我必须做任何串联。但是,当应用程序正在执行此解析时,应用程序cpu使用率变高(60-70%)。我猜测调用这些字符串API是什么导致CPU使用率变高,特别是数据的大小很大(典型的字符串长度是400K)。任何想法如何验证是什么导致CPU使用率达到这么高,并且如果有任何关于如何降低CPU使用率的建议?大字符串数据解析导致高CPU使用率

+3

你还没有具体说明为什么高CPU占用率是一件坏事。你是否想为其他流程/线程留下足够的“呼吸空间”? – vlad 2011-03-21 14:30:14

+1

分析它并寻找瓶颈。你确定它不是由IO操作引起的(读/写到光盘)? – 2011-03-21 14:32:27

+0

@ Vlad。一般情况下,你是否希望控制CPU使用情况?当高CPU使用率被认为是一件好事? – 2011-03-21 14:53:27

回答

1

除了Jon的回答,如果你的解析器不需要做回溯,即它总是通过sting向前读取,并且字符串的来源不是文件/网络流,你可以使用StreamReader只需将你的字符串换成StringReader而不是例如

//Create a StringReader using the String variable data which has your String in it 
//A StringReader is just a TextReader implementation for Strings 
StringReader reader = new StringReader(data); 

//Now do whatever manipulation on the string you want... 
+0

+1是的,这可以帮助,如果字符串不能从流中获取,将是值得一试的。但是,如果字符串是从流中获取的(甚至是间接的,就像Request.Form的最终值来自Request。InputStream,为你完成一些处理),然后移动直接从流中获取它可能是一大收获。 – 2011-03-21 17:40:32

+0

是的,我已经写了很多流解析器,特别是在过去的一两年里,我总是尽可能使用'StreamReader' – RobV 2011-03-21 17:42:05

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)); 

在其他情况下,这并不适用,还是有办法来块的字符串进行处理。

2

找出CPU使用率是来自:看What Are Some Good .NET Profilers?

要减少CPU使用:这取决于,当然,对什么实际抽空。例如,你可能会考虑不用实际的子字符串,而是用小的对象编码它们来自的大字符串的位置。 (不能保证这实际上是一种改进。)很有可能,当你分析你的代码时,会有一些东西作为问题跳出来,他们可能是你从未猜到过的事情,并且只要你知道他们需要修复,他们可能很容易修复。