static void Main(string[] args)
{
//
// TODO: アプリケーションを開始するコードをここに追加してください。
//
string startString = "begin";
string s = "";
int count = 10000; StringBuilder sb = new StringBuilder(startString);
DateTime startTime1 = DateTime.Now;
for(int i = 0;i<= count;i++)
{
sb.Append(s);
}
DateTime endTime1 = DateTime.Now;
//TimeSpan elapsedTime1 = endTime1-startTime1;
Console.WriteLine((endTime1-startTime1).ToString());
DateTime startTime2 = DateTime.Now;
for(int i = 0;i<=count;i++)
{
startString += s;
}
DateTime endTime2 = DateTime.Now;
//TimeSpan elapsedTime2 = endTime2 - startTime2;
Console.WriteLine((endTime2-startTime2).ToString());
Console.ReadLine();

}正常情况下,stringBuilder的处理字符串的速度应该比较快,当要追加的字符串 s 非空时,是正常的,处理的时间比较短,可是当 s 为空字符串时,结果恰好就反过来了,不明白为什么,难道和内存的分配有关系吗?

解决方案 »

  1.   

    如果string s = null;就不会了
    public static string Concat(string str0, string str1)
    {
        if (IsNullOrEmpty(str0))
        {
            if (IsNullOrEmpty(str1))
            {
                return Empty;
            }
            return str1;
        }
        if (IsNullOrEmpty(str1))
        {
            return str0;
        }
        int length = str0.Length;
        string dest = FastAllocateString(length + str1.Length);
        FillStringChecked(dest, 0, str0);
        FillStringChecked(dest, length, str1);
        return dest;
    }  
    public StringBuilder Append(string value)
    {
        if (value != null)
        {
            string stringValue = this.m_StringValue;
            IntPtr currentThread = Thread.InternalGetCurrentThread();
            if (this.m_currentThread != currentThread)
            {
                stringValue = string.GetStringForStringBuilder(stringValue, stringValue.Capacity);
            }
            int length = stringValue.Length;
            int requiredLength = length + value.Length;
            if (this.NeedsAllocation(stringValue, requiredLength))
            {
                string newString = this.GetNewString(stringValue, requiredLength);
                newString.AppendInPlace(value, length);
                this.ReplaceString(currentThread, newString);
            }
            else
            {
                stringValue.AppendInPlace(value, length);
                this.ReplaceString(currentThread, stringValue);
            }
        }
        return this;
    }