Я просто вхожу в функциональное программирование и пытаюсь понять, когда класс/свойство должен быть изменен.Неизбежность вызывает проблемы с производительностью?
При работе со значительным количеством строк сцеплений, мы знаем, что лучше использовать 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
обеспечивает лучшую производительность, создавая меньше строк.
Есть ли баланс между производительностью и неизменностью, или это случайное исключение по какой-либо причине?
Я получил две вещи от этого ответа - 1. В некоторой степени это исключение (алгоритм больше виноват, чем изменчивость структуры данных) и 2. В общем, вы, похоже, поддерживаете интеллектуальный алгоритм, простой структура данных лагерь. Это справедливое резюме? –
@ MarkStafford-MSFT Это звучит справедливо для меня. – dubiousjim