2011-03-21 177 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使用:這取決於,當然,對什麼實際抽空。例如,你可能會考慮不用實際的子字符串,而是用小的對象編碼它們來自的大字符串的位置。 (不能保證這實際上是一種改進。)很有可能,當你分析你的代碼時,會有一些東西作爲問題跳出來,他們可能是你從未猜到過的事情,並且只要你知道他們需要修復,他們可能很容易修復。