2011-01-05 58 views
1

我有這裏的代碼來創建一個X空格字符串。創建一個重複的字符串並緩存它?

private static string GetWhiteSpaceString(int howManySpaces) 
{ 
    return new string(' ', howManySpaces); 
} 

我怎麼能以某種方式緩存這個字符串,所以它只能創建如果空格的數量改變例如?有沒有比保留一些全局變量更好的方法?

謝謝:)

+2

如果你需要緩存它,這表明你正在創建這些的%^ tloads。爲什麼? – 2011-01-05 09:27:46

+5

「我們應該忘記小效率,大約97%的時間:過早優化是萬惡之源」 - Knuth – 2011-01-05 09:27:46

+0

請注意,如果數據是靜態的,使這種方法*同步*非常重要;請參閱我的更新以獲取更多信息 – 2011-01-05 10:38:43

回答

2

我不認爲你需要緩存String.Net處理得很好。

但是,如果您仍想繼續操作,爲什麼不創建Dictionary<int,string>類型來存儲生成的字符串並在返回新字符串之前查看它?

0

您可以創建一個靜態的(同步)Dictionary<int,string> - 或者,如果你正在緩存所有的長度達到一個已知的大小,只是一個string[](更快,更簡單;無需同步其一)。

例如:

static readonly Dictionary<int, string> cache 
     = new Dictionary<int, string>(); 
    public static string GetSpaces(int count) { 
     // deal with brain-dead cases first to avoid lock for short strings 
     switch (count) 
     { // note these are all interned etc 
      case 0: return ""; 
      case 1: return " "; 
      case 2: return " "; 
      case 3: return " "; 
      case 4: return " "; 
      case 5: return "  "; 
      case 6: return "  "; 
      case 7: return "  "; 
      case 8: return "  "; 
      case 9: return "   "; 
      case 10: return "   "; 
     } 
     if(count < 0) throw new ArgumentOutOfRangeException("count"); 
     lock (cache) { 
      string s; 
      if (!cache.TryGetValue(count, out s)) { 
       cache.Add(count, s = new string(' ', count)); 
      } 
      return s; 
     } 
    } 
1

可能是這樣的(僅在瀏覽器中編碼,可能無法正常工作):

Dictionary<int, string> cache = new Dictionary<int, string>(); 
private static string GetWhiteSpaceString(int howManySpaces) 
{ 
    if(cache.Keys.Contains(howManySpaces)) 
    { 
     return cache[howManySpaces]; 
    } 
    else 
    { 
     var text = new string(' ', howManySpaces); 
     cache[howManySpaces] = text; 
     return text; 
    } 
} 

這可能會做你想要什麼,但我很擔心內存的使用。我想這取決於多少howManySpaces變化。

+0

如果將邏輯切換爲使用'TryGet',則可以避免在項目存在時執行雙重查找。 – 2011-01-05 09:39:11

1

創建字符串的方法可能不是緩存它們的最佳位置(如果甚至有足夠的理由緩存它們)。使用字符串的代碼可能包含有關哪些字符串可以重用的更多信息。

如果緩存字符串,它們將是長壽命的對象。這意味着他們可能會被移到下一代內存堆中。將一個對象從一個堆移動到另一個堆意味着它將從內存中的一個位置複製到另一個位置,所以這至少與創建新字符串一樣重要。

在大多數情況下,創建新字符串而不是緩存它們會更有效。垃圾收集器特別用於高效地處理短暫的對象。

相關問題