我在下面有这个代码,我循环遍历字符串并通过char比较所有char,这是一个非常慢的过程我想知道如何改进这段代码。
//delete anti-xss junk ")]}'\n" (5 chars);
if (trim)
{
googlejson = googlejson.Substring(5);
}
//pass through result and turn empty elements into nulls
//echo strlen( $googlejson ) . '<br>';
bool instring = false;
bool inescape = false;
string lastchar = "";
string output = "";
for ( int x=0; x< googlejson.Length; x++ ) {
string ch = googlejson.Substring(x, 1);
//toss unnecessary whitespace
if ( !instring && ( Regex.IsMatch(ch, @"/\s/"))) {
continue;
}
//handle strings
if ( instring ) {
if (inescape) {
output += ch;
inescape = false;
} else if ( ch == "\\" ) {
output += ch;
inescape = true;
} else if ( ch == "\"") {
output += ch;
instring = false;
} else {
output += ch;
}
lastchar = ch;
continue;
}
switch ( ch ) {
case "\"":
output += ch;
instring = true;
break;
case ",":
if ( lastchar == "," || lastchar == "[" || lastchar == "{" ) {
output += "null";
}
output += ch;
break;
case "]":
case "}":
if ( lastchar == "," ) {
output += "null";
}
output += ch;
break;
default:
output += ch;
break;
}
lastchar = ch;
}
return output;
这太棒了。
我已经更改了以下两行,并获得了惊人的性能提升,如1000%或其他
首先改变这个
string ch = googlejson.Substring(x, 1);
到那个
string ch = googlejson[x].ToString();
其次我用String Builder替换了所有+ = ch
output.Append(ch);
因此,这两项变更会对性能产生最大影响。
答案 0 :(得分:6)
首先,在仅处理单个字符时,不应使用Substring
s。使用
char ch = googlejson[x];
代替。
您还可以考虑为StringBuilder
变量使用output
。如果您正在使用字符串,那么您应该始终牢记,.NET中的字符串是 immutable ,因此对于每个字符串
output += ch;
创建了一个新的字符串实例。
使用
StringBuilder output = new StringBuilder();
和
output.append(ch);
代替。
答案 1 :(得分:2)
根据其他评论,此代码使用字符串作为字符和Substring()在性能方面非常可怕。 此外,使用正则表达式检查空白效率是非常低效的。
如果要对字符进行操作,请使用字符(字符)而非字符串。
for循环效率有点低,但JIT编译器可能会优化它。使用局部变量而不是访问Length属性会稍好一些。
对字符串进行切换也非常低效,因为切换字符的速度非常快。
正如MartinStettner所说,StringBuilder追加将更好地构建结果。 (@Tom Squires - 这个问题都是关于性能的,所以是的,它确实重要,而且它并不复杂 - 它可能是更多的字符,但这并不复杂。
最后,我会说,如果你遇到性能问题(除了这个可怕的代码),你应该考虑使用分析器测量它,然后再进行优化。
PS这看起来像是一个面试问题......但是如果是这样的话,那就不是SO的用途了。
答案 2 :(得分:0)
为什么不使用StringReader
代替SubString
var output = new StringBuilder();
using (var reader = new StringReader(googleJson)
{
var buffer = new char[1]
while (reader.Read(buffer, 0, 1) == 1)
{
var ch = buffer[0];
//your stuff
output.Append(ch);
}
}
return output.ToString();
您可以使用StringReader.Read()
并对charachter的整数代码值执行所有逻辑操作,这些值很快但有点脆弱。
答案 3 :(得分:0)
怎么样:
if ( !instring && ( Regex.IsMatch(ch, @"/\s/")))
到
if ( !instring && ch < 33)
甚至更好:
if ( !instring && Char.IsWhiteSpace(ch))