dottrace and optimizing method with indexof

233 views Asked by At
public static string[] GetStringInBetween(string strBegin, string strEnd, string strSource, bool includeBegin, bool includeEnd)
        {
            string[] result = { "", "" };
            int iIndexOfBegin = strSource.IndexOf(strBegin);

            if (iIndexOfBegin != -1)
            {
                // include the Begin string if desired
                if (includeBegin)
                    iIndexOfBegin -= strBegin.Length;

                strSource = strSource.Substring(iIndexOfBegin + strBegin.Length);
                int iEnd = strSource.IndexOf(strEnd);

                if (iEnd != -1)
                {
                    // include the End string if desired
                    if (includeEnd)
                        iEnd += strEnd.Length;

                    result[0] = strSource.Substring(0, iEnd);

                    // advance beyond this segment
                    if (iEnd + strEnd.Length < strSource.Length)
                        result[1] = strSource.Substring(iEnd + strEnd.Length);
                }
            }

            return result;
        }

usage:

string[] result = null;
result = HtmlHelper.GetStringInBetween(bits[0], bits[1], tagValuePair.Value, true, true);

i am using dottrace and this method use 33% of my CPU. How can i optimize it. Becouse of it my application crash or i get out of memory. Is it smart that this method is static?

dottrace show 30% usage of cpu on this:

System.String.IndexOf(String, Int32, Int32, StringComparison)

enter image description here

EDIT:

    GetStringInBetween(string strBegin, string strEnd, string strSource, bool includeBegin, bool includeEnd)

strBegin = "<td class=\"m92_t_col2\">"
strEnd = "</td>"
strSource = "xxxxxxxx<td class=\"m92_t_col2\">Di. 31.01.12</td>xxxxxxxxxxxxxx
includeBegin = true
includeEnd = true

then i will get result
result[0] = "<td class=\"m92_t_col2\">Di. 31.01.12</td>"

hope this helps what this method do. Try to find string between strBegin and strEnd...

2

There are 2 answers

1
500 - Internal Server Error On BEST ANSWER

Copying part of the string (your first SubString call) just to keep searching in it is bad for performance. Instead, keep your original input string but use the overload on IndexOf that takes a start index and then adjust your index calculation for extracting the result accordingly.

Also, knowing that these strings are not localized, you might gain some by using an ordinal comparer in IndexOf.

Something along the lines of

public static string[] GetStringInBetween(string strBegin, string strEnd, string strSource, bool includeBegin, bool includeEnd)
{
    string[] result = { "", "" };
    int iIndexOfBegin = strSource.IndexOf(strBegin, StringComparison.Ordinal);

    if (iIndexOfBegin != -1)
    {
        int iEnd = strSource.IndexOf(strEnd, iIndexOfBegin, StringComparison.Ordinal);

        if (iEnd != -1)
        {
            result[0] = strSource.Substring(
                iIndexOfBegin + (includeBegin ? 0 : strBegin.Length), 
                iEnd + (includeEnd ? strEnd.Length : 0) - iIndexOfBegin);

            // advance beyond this segment
            if (iEnd + strEnd.Length < strSource.Length)
                result[1] = strSource.Substring(iEnd + strEnd.Length);
        }
    }

    return result;
}
0
Oded On

For your sample input, it appears you are working with HTML fragments.

I suggest using the HTML Agility Pack to parse the HTML - it exposes the result in an easy to query fashion, using LINQ to XML or XPath type syntax. It is a fast and efficient library.