我剛剛進入函數式編程並試圖瞭解何時應該使類/屬性變爲可變。不可變性會導致性能問題嗎?
當字符串連接的顯著數量的工作,我們知道它是更好地使用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