new CultureInfo v.s CultureInfo.GetCultureInfo

要取得 CultureInfo 通常有兩種做法,一個是透過建構子構建 ,一個則是透過 CultureInfo.GetCultureInfo 去取得。


透過建構子建立會產生新的物件,若頻繁的調用會對 GC 造成不必要的負擔。若改調用 CultureInfo.GetCultureInfo,會從快取中拿取,不會頻繁的建構,效能上也會比較好。


這邊筆者實際做個簡單的測試:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System;
using System.Globalization;
using System.Diagnostics;

public class Program
{
public static void Main()
{
var count = 10000000;
Console.WriteLine( "new CultureInfo: {0} ms" , DoTest(count, () =>
{
var cultureInfo = new CultureInfo("en-GB" );
}).ToString());

Console.WriteLine( "CultureInfo.GetCultureInfo: {0} ms" , DoTest(count, () =>
{
var cultureInfo = CultureInfo.GetCultureInfo("en-GB" );
}).ToString());
}

static long DoTest(int count, Action action)
{
var sw = Stopwatch.StartNew();
for ( int i = 0; i < count; ++i)
{
action();
}

return sw.ElapsedMilliseconds;
}
}


可以看到 CultureInfo.GetCultureInfo 有著較佳的效能。


最後這邊附上實驗的數據。