我的应用程序需要解析一些大字符串数据。这意味着我大量使用字符串类的Split,IndexOf和SubString方法。我试图使用StringBuilder类无论我必须做任何串联。但是,当应用程序正在执行此解析时,应用程序cpu使用率变高(60-70%)。我猜测调用这些字符串API是什么导致CPU使用率变高,特别是数据的大小很大(典型的字符串长度是400K)。任何想法如何验证是什么导致CPU使用率达到这么高,并且如果有任何关于如何降低CPU使用率的建议?大字符串数据解析导致高CPU使用率
回答
除了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...
+1是的,这可以帮助,如果字符串不能从流中获取,将是值得一试的。但是,如果字符串是从流中获取的(甚至是间接的,就像Request.Form的最终值来自Request。InputStream,为你完成一些处理),然后移动直接从流中获取它可能是一大收获。 – 2011-03-21 17:40:32
是的,我已经写了很多流解析器,特别是在过去的一两年里,我总是尽可能使用'StreamReader' – RobV 2011-03-21 17:42:05
要检查的一件事是,你要尽可能多地传递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));
在其他情况下,这并不适用,还是有办法来块的字符串进行处理。
找出CPU使用率是来自:看What Are Some Good .NET Profilers?
要减少CPU使用:这取决于,当然,对什么实际抽空。例如,你可能会考虑不用实际的子字符串,而是用小的对象编码它们来自的大字符串的位置。 (不能保证这实际上是一种改进。)很有可能,当你分析你的代码时,会有一些东西作为问题跳出来,他们可能是你从未猜到过的事情,并且只要你知道他们需要修复,他们可能很容易修复。
- 1. Application.Idle导致高CPU使用率
- 2. 解析非常大的JSON字符串在IE导致问题
- 3. NSFileHandleDataAvailableNotification文件反复无新数据(导致CPU使用率非常高)
- 4. 由于CPU使用率过高导致服务器挂起
- 5. 多线程导致CPU使用率更高
- 6. 过程“系统”导致CPU使用率过高
- 7. Mongoose(node.js模块)导致高CPU使用率
- 8. Visual Studio调试导致SQL Server(x64)CPU使用率过高
- 9. 调用String.Concat导致高CPU不显示在CPU使用率选项卡
- 10. CPU使用率高,串口时间
- 11. REGEX:解析大字符串
- 12. http请求正文解析导致高CPU消耗
- 13. Java - 高CPU使用率
- 14. 高mySQL cpu使用率
- 15. wordpress 4.8高CPU使用率
- 16. javaw.exe CPU使用率高
- 17. C++,CPU使用率过高
- 18. Android。 CPU使用率太高
- 19. wordpress中CPU使用率高
- 20. Android Socket高CPU使用率
- 21. Scrapy高CPU使用率
- 22. CakePHP 1.3:CPU使用率高
- 23. 解析字符串用空格日期,导致ParseException的
- 24. 使用retrofit2解析字符串数组
- 25. CPU利用率高
- 26. 解析数字字符串
- 27. python的字符串解析不一致
- 28. 使用SOAP发送数据时的高CPU使用率
- 29. Cpu使用率过高,高达95%
- 30. 最大CPU使用率
你还没有具体说明为什么高CPU占用率是一件坏事。你是否想为其他流程/线程留下足够的“呼吸空间”? – vlad 2011-03-21 14:30:14
分析它并寻找瓶颈。你确定它不是由IO操作引起的(读/写到光盘)? – 2011-03-21 14:32:27
@ Vlad。一般情况下,你是否希望控制CPU使用情况?当高CPU使用率被认为是一件好事? – 2011-03-21 14:53:27