C#循环遍历字符数组效率不高

时间:2012-02-03 09:29:39

标签: c#

我在下面有这个代码,我循环遍历字符串并通过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);

因此,这两项变更会对性能产生最大影响。

4 个答案:

答案 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))