2011-01-05 3 views
1

X 공간의 문자열을 만들려면이 코드를 사용하십시오.반복되는 문자열을 만들고 캐시하십시오?

어떻게하면이 문자열을 캐시 할 수 있습니까? 예를 들어 공백 수가 변경되면 어떻게 만듭니 까? 일부 전역 변수를 유지하는 것보다 더 좋은 방법이 있습니까?

감사합니다 :)

+2

캐시해야하는 경우, 이것들은 s %^tloads를 생성하고 있음을 나타냅니다. 왜? –

+5

"시간의 약 97 %를 차지하는 작은 효율성을 잊어 버려야한다. 즉각적인 최적화는 모든 악의 근원이다."- Knuth –

+0

데이터가 정적 인 경우 이러한 메서드를 * 동기화 *하는 것이 중요합니다. 자세한 내용은 내 업데이트를 참조하십시오. –

답변

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'을 사용하도록 로직을 전환하면 항목이있을 때 이중 검색을 피할 수 있습니다. –

1

문자열을 만드는 방법은 캐시 할 수있는 최적의 장소가 아닙니다 (캐쉬할만한 충분한 이유가있는 경우). 문자열을 사용하는 코드에는 재사용 할 수있는 문자열에 대한 자세한 정보가있을 수 있습니다.

문자열을 캐시하면 긴 수명의 개체가됩니다. 즉, 아마 차세대 메모리 힙으로 옮겨 질 것입니다. 한 힙에서 다른 힙으로 객체를 옮기는 것은 메모리의 한 위치에서 다른 위치로 복사된다는 것을 의미하므로 새로운 문자열을 만드는 것만큼이나 많은 작업이 수행됩니다.

대부분의 경우 캐싱하지 않고 새 문자열을 만드는 것이 더 효율적입니다. 가비지 컬렉터는 특히 수명이 짧은 오브젝트를 효율적으로 처리하도록 만들어졌습니다.

관련 문제