我的應用程序需要解析一些大字符串數據。這意味着我大量使用字符串類的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. NSURLSessionDataTask導致高CPU使用率
- 2. 導致高CPU使用率的腳本
- 3. Application.Idle導致高CPU使用率
- 4. 漢王FaceID導致字符串解析
- 5. 解析字符串導致重複值
- 6. 在tomcat中分析高CPU使用率
- 7. 大字符串與Papa解析導致Chrome和Opera崩潰
- 8. 解析非常大的JSON字符串在IE導致問題
- 9. NSFileHandleDataAvailableNotification文件反覆無新數據(導致CPU使用率非常高)
- 10. HTML5文件上傳塊/切片導致高CPU使用率
- 11. 與內連接導致CPU使用率過高
- 12. Socket.io客戶端導致高CPU使用率
- 13. 由於CPU使用率過高導致服務器掛起
- 14. 過程「系統」導致CPU使用率過高
- 15. Pkcs11Interop CKR_ENCRYPTED_DATA_INVALID異常導致CPU使用率很高
- 16. 命名管道在服務中導致CPU使用率高
- 17. Visual Studio調試導致SQL Server(x64)CPU使用率過高
- 18. Mongoose(node.js模塊)導致高CPU使用率
- 19. 多線程導致CPU使用率更高
- 20. SqlCacheDependency導致的SQL Server上的CPU使用率過高
- 21. 從Oracle 10g獲取Clob導致高CPU使用率
- 22. 調用String.Concat導致高CPU不顯示在CPU使用率選項卡
- 23. 大網格的小小的彩色正方形導致高CPU使用率
- 24. 讀取沒有CPU使用率高的串行數據
- 25. REGEX:解析大字符串
- 26. http請求正文解析導致高CPU消耗
- 27. 在XFire中解析XML會導致CPU高?
- 28. Android Socket高CPU使用率
- 29. C++,CPU使用率過高
- 30. Java - 高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