2012-07-03 1 views
2

Я просто вхожу в функциональное программирование и пытаюсь понять, когда класс/свойство должен быть изменен.Неизбежность вызывает проблемы с производительностью?

При работе со значительным количеством строк сцеплений, мы знаем, что лучше использовать StringBuilder, например:

using System; 
using System.Diagnostics; 
using System.Text; 

namespace ConsoleApplication3 
{ 
    internal class Program 
    { 
     private static string myStr; 
     private static readonly StringBuilder mySb = new StringBuilder(); 

     private static void Main(string[] args) 
     { 
      Profile("+", 100000,() => myStr = myStr + "a"); // Takes 2236 ms 
      Profile("SB", 100000,() => mySb.Append("a")); // Takes 1 ms 
     } 

     private static void Profile(string description, int iterations, Action func) 
     { 
      // clean up 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
      GC.Collect(); 

      // warm up 
      func(); 

      Stopwatch watch = Stopwatch.StartNew(); 
      for (int i = 0; i < iterations; i++) 
      { 
       func(); 
      } 
      watch.Stop(); 
      Console.Write(description); 
      Console.WriteLine(" Time Elapsed {0} ms", watch.ElapsedMilliseconds); 
     } 
    } 
} 

Это широко известный случай, в котором он более производительный значительно для конкатенации строк через StringBuilder против оператора +. Мое предположение заключается в том, что StringBuilder обеспечивает лучшую производительность, создавая меньше строк.

Есть ли баланс между производительностью и неизменностью, или это случайное исключение по какой-либо причине?

ответ

6

Взаимодействие с цепочками эффективно не связано с изменчивыми и неизменяемыми структурами, а также о выборе правильной структуры данных и стратегии оценки для поддержки O (1) append.

Как правило, деревья различных сортов используются для поддержки быстрого добавления, которые максимизируют совместное использование и минимизируют копирование. Примеры структур включают ropes и finger trees.

В некоторых случаях также может помочь ленивая оценка (например, если конкатенация включает в себя копирование, которое может быть отложено до того, когда и когда на самом деле нужен хвост строки). Строгая структура данных может привести к дополнительным накладным расходам на копирование в таком случае, делая больше работы, чем это необходимо.

В вашем случае, я подозреваю, что + включает строгую копию аргументов (т.е. O (п + т)) работу, в то время как струна строитель может избежать некоторых работ по амортизировать перераспределение буфера строки (давая вам древовидную производительность за счет требования линейного использования структуры и потери безопасности потоков).

+0

Я получил две вещи от этого ответа - 1. В некоторой степени это исключение (алгоритм больше виноват, чем изменчивость структуры данных) и 2. В общем, вы, похоже, поддерживаете интеллектуальный алгоритм, простой структура данных лагерь. Это справедливое резюме? –

+0

@ MarkStafford-MSFT Это звучит справедливо для меня. – dubiousjim