SORU
29 HAZİRAN 2011, ÇARŞAMBA


String.() Değiştirmek vs StringBuilder.()Değiştirin

Bir sözlük değerlerle işaretleri yerine bir dize var. Mümkün olduğunca verimli olması gerekiyor. Bir dize ile bir döngü yapmak.yerine sadece bellek (dize değişmez, unutmayın) tüketiyor. StringBuilder.() Yerine bu dize manipülasyonlar ile çalışmak üzere tasarlanmıştır beri? daha iyi olacak

Düzenli pahasına önlemek için umuyordum, ama eğer bir daha verimli olacaksa öyle olsun.

Not: kod karmaşıklığı hakkında umurumda değil, sadece çalışır ve nasıl tükettiği bellek.

Ortalama istatistikler: uzunluğu 255-1024 karakterler, 15-30 sözlükte anahtarları.

CEVAP
29 HAZİRAN 2011, ÇARŞAMBA


RedGate kullanarak aşağıdaki kodu kullanarak Profiler

class Program
    {
        static string data = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";
        static Dictionary<string, string> values;

        static void Main(string[] args)
        {
            Console.WriteLine("Data length: "   data.Length);
            values = new Dictionary<string, string>()
            {
                { "ab", "aa" },
                { "jk", "jj" },
                { "lm", "ll" },
                { "yz", "zz" },
                { "ef", "ff" },
                { "st", "uu" },
                { "op", "pp" },
                { "x", "y" }
            };

            StringReplace(data);
            StringBuilderReplace1(data);
            StringBuilderReplace2(new StringBuilder(data, data.Length * 2));

            Console.ReadKey();
        }

        private static void StringReplace(string data)
        {
            foreach(string k in values.Keys)
            {
                data = data.Replace(k, values[k]);
            }
        }

        private static void StringBuilderReplace1(string data)
        {
            StringBuilder sb = new StringBuilder(data, data.Length * 2);
            foreach (string k in values.Keys)
            {
                sb.Replace(k, values[k]);
            }
        }

        private static void StringBuilderReplace2(StringBuilder data)
        {
            foreach (string k in values.Keys)
            {
                data.Replace(k, values[k]);
            }
        }
    }
  • String.= 5.843 ms değiştirin
  • StringBuilder.#1 = 4.059 ms değiştirin
  • Stringbuilder.#2 = 0.461 ms değiştirin

Dize uzunluğu = 1456

#1 #2 değil öyle olsa yöntemi oluşturur stringbuilder stringbuilder performans farkı yöntemi işe aynı hareket olduğuna göre büyük ihtimalle sona erecek. Eğer ile başlar eğer bir string yerine stringbuilder sonra #2 yerine gitmek için yolu olabilir.

Bildiğim kadarıyla bellek gibi, RedGateMemory profiler kullanarak, stringbuilder genel kazanacağını içine BİRÇOK yerini işlemleri elde edene kadar endişelenecek bir şey yok.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bokeh

    Bokeh

    9 HAZİRAN 2014
  • Matt Harding

    Matt Harding

    23 Mayıs 2006
  • Motor Trend Channel

    Motor Trend

    11 Mart 2006