X 공간의 문자열을 만들려면이 코드를 사용하십시오.반복되는 문자열을 만들고 캐시하십시오?
어떻게하면이 문자열을 캐시 할 수 있습니까? 예를 들어 공백 수가 변경되면 어떻게 만듭니 까? 일부 전역 변수를 유지하는 것보다 더 좋은 방법이 있습니까?
감사합니다 :)
X 공간의 문자열을 만들려면이 코드를 사용하십시오.반복되는 문자열을 만들고 캐시하십시오?
어떻게하면이 문자열을 캐시 할 수 있습니까? 예를 들어 공백 수가 변경되면 어떻게 만듭니 까? 일부 전역 변수를 유지하는 것보다 더 좋은 방법이 있습니까?
감사합니다 :)
난 당신이 String
를 캐시 할 필요가 있다고 생각하지 않습니다. .Net
꽤 잘 처리합니다.
계속 하시겠습니까? 생성 된 문자열을 저장하고 새 문자열을 반환하기 전에 봐야 할 유형을 Dictionary<int,string>
으로 만들지 않으시겠습니까? (전용 브라우저에서 코딩, 작동하지 않을 수 있습니다)이 같은
당신은 (동기화) 정적 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;
}
}
아마 뭔가 :
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
에 달려 있는지에 달려 있다고 생각한다.
'TryGet'을 사용하도록 로직을 전환하면 항목이있을 때 이중 검색을 피할 수 있습니다. –
문자열을 만드는 방법은 캐시 할 수있는 최적의 장소가 아닙니다 (캐쉬할만한 충분한 이유가있는 경우). 문자열을 사용하는 코드에는 재사용 할 수있는 문자열에 대한 자세한 정보가있을 수 있습니다.
문자열을 캐시하면 긴 수명의 개체가됩니다. 즉, 아마 차세대 메모리 힙으로 옮겨 질 것입니다. 한 힙에서 다른 힙으로 객체를 옮기는 것은 메모리의 한 위치에서 다른 위치로 복사된다는 것을 의미하므로 새로운 문자열을 만드는 것만큼이나 많은 작업이 수행됩니다.
대부분의 경우 캐싱하지 않고 새 문자열을 만드는 것이 더 효율적입니다. 가비지 컬렉터는 특히 수명이 짧은 오브젝트를 효율적으로 처리하도록 만들어졌습니다.
캐시해야하는 경우, 이것들은 s %^tloads를 생성하고 있음을 나타냅니다. 왜? –
"시간의 약 97 %를 차지하는 작은 효율성을 잊어 버려야한다. 즉각적인 최적화는 모든 악의 근원이다."- Knuth –
데이터가 정적 인 경우 이러한 메서드를 * 동기화 *하는 것이 중요합니다. 자세한 내용은 내 업데이트를 참조하십시오. –