2009-12-18 2 views
0

Я прочитал статью о производительности строковых методов "a" + b в сравнении с string.Format ("a {1}", b) и решил сделать тест.Оцените использование памяти в .NET (VS)

Есть мой код в приложении WinForms (VS 2005, но заинтересован в обоих 2005/2008).

private void button1_Click(object sender, EventArgs e) 
    { 
     Stopwatch stopwatch = new Stopwatch(); 

     stopwatch.Start(); 
     for (int i = 0; i < 10000; i++) 
     { 
      Console.Write("1" + 2 + "3" + 4 + "5"); 
     } 
     stopwatch.Stop(); 
     Console.WriteLine("**********"); 
     Console.WriteLine("'A'+'B'+'C'... 10 000 elapsed: {0}", 
      stopwatch.Elapsed.ToString()); 
     Console.WriteLine("**********"); 
     stopwatch.Reset(); 

     stopwatch.Start(); 
     for (int i = 0; i < 10000; i++) 
     { 
      Console.Write(string.Format("1{0}3{1}5", 2, 4)); 
     } 
     stopwatch.Stop(); 
     Console.WriteLine("**********"); 
     Console.WriteLine("string.Format((A)B(C)...) 10 000 elapsed: {0}", 
      stopwatch.Elapsed.ToString()); 
     Console.WriteLine("**********"); 

    } 

на моей машине вывод состоит в следующем:


12345123451234512345123451234512345123451234512345123451 ...

'A' + 'B' + 'C' ... 10 000 истекшее: 00 : 00: 0 9,4217880


1234512345123451234512 3451234512345123451234512345123451 ...

String.Format ((А) В (С) ...) 10 000 истекшее: 00: 00: 0 9,8507060


Таким образом, время почти тоже самое.

Теперь я задаюсь вопросом, сколько памяти я использовал. Есть ли способ сравнить использование памяти и работу GarbageCollector?

Я загрузил пробную версию .NET Memory Profiler ... но, возможно, существует более простой (как, например, выше) способ обнаружения потраченной памяти на обеих итерациях?

Спасибо.

+2

Вы действительно должны устранить Console.Write в тестовом цикле. Вывод относительно медленный, и, скорее всего, там есть бутылочная шейка, а не при формировании струны, где вы хотите. – jdmichal

+2

Просто, чтобы поддержать это, время для второго на моей машине. С выходом: 0.5482043s. Без вывода: 0.0098585s. – jdmichal

ответ

1

GC.GetTotalMemory может быть достаточно точным:

http://msdn.microsoft.com/en-us/library/system.gc.gettotalmemory.aspx

В противном случае, вы можете использовать счетчики производительности CLR GC Heap через System.Diagnostics.PerformanceCounter.

+0

hm ... и где, по вашему мнению, я должен назвать ** GC.GetTotalMemory **? – serhio

+1

Возможно, сделайте это после каждых 100 итераций, посмотрите, дает ли вам хорошую картину. Если вы хотите получить график, просто запустите Performance Monitor и добавьте счетчики GC .Net. – codekaizen

1

Мои рекомендации будут ...

Я бы вынуть Console.WriteLine в циклах, так как Console.WriteLine вводит свой собственный эффект наблюдателя в то время, прошедшее. Просто назначьте его переменной или аналогичной.

Вы также можете не указывать String.Format справедливый перерыв ... вы понятия не имеете, прошел ли GC между двумя вашими петлями. GC может быть ногами, пока вы находитесь во втором цикле, искажая свое время. Или это может вообще не быть ногами. Я был бы уверен в этом или проверил бы тест в обратном порядке, чтобы быть уверенным.

Струны - это особый случай в целом. Многие из проблем со строками в .NET фактически исходят из того, как окна имеют дело со строками. Лучший способ, я могу сказать, что строки не так чисто GC'ed, как другие объекты, поэтому все, что я могу сделать, чтобы не создавать больше строк, чем мне нужно. Конечно, мы имеем дело со множеством строк, потому что это то, что мы делаем, поэтому я говорю только о создании дополнительных строк.

Пример: Кажется здоровым создавать команды SQL из шаблона со String.Формат («выберите {0} из {1}, где {2}", selectStmt, fromStmt, гдеStmt), но более эффективно просто сохранять выбранные нужды как константы или подобные, особенно если вы собираетесь их запускать много и строить эту же строку снова и снова. Это также меньше восприимчив к SQL-инъекции (не отвлекаясь на это на данном этапе). Вот только в качестве примера, я не утверждаю, что вы не должны использовать ORM и т.д.

Заканчивать http://blog.briandicroce.com/2008/02/04/stringbuilder-vs-string-performance-in-net/

Смежные вопросы