.NET의 StringBuilder 내용을 지우는 가장 좋은 방법
StringBuilder를 재사용하기 위해 내용을 지우는 가장 좋은 방법 (더 적게 지속되거나 리소스를 적게 소비 함)이 무엇이라고 생각하는지 묻고 싶습니다. 다음 시나리오를 상상해보십시오.
StringBuilder sb = new StringBuilder();
foreach(var whatever in whateverlist)
{
sb.Append("{0}", whatever);
}
//Perform some stuff with sb
//Clear stringbuilder here
//Populate stringbuilder again to perform more actions
foreach(var whatever2 in whateverlist2)
{
sb.Append("{0}", whatever2);
}
그리고 StringBuilder를 지울 때 두 가지 가능성을 생각할 수 있습니다.
sb = new StringBuilder();
또는
sb.Length = 0;
그것을 지우는 가장 좋은 방법은 무엇이며 그 이유는 무엇입니까?
감사합니다.
편집 : 현재 .NET 3.5 버전을 사용합니다.
.NET 2.0 또는 3.5에서이 작업을 수행하는 경우 다음과 같이 확장 메서드를 작성합니다.
/// <summary>
/// Clears the contents of the string builder.
/// </summary>
/// <param name="value">
/// The <see cref="StringBuilder"/> to clear.
/// </param>
public static void Clear(this StringBuilder value)
{
value.Length = 0;
value.Capacity = 0;
}
그런 다음 다음과 같이 지울 수 있습니다.
someStringBuilder.Clear();
그런 다음 4.0이 나오면 4.0 버전을 선호하는 확장 방법을 버릴 수 있습니다.
업데이트 : 용량을 0으로 설정하는 것은 좋은 생각이 아닙니다. 동일한 인스턴스를 재사용하는 경우 빌더에 추가 할 때 재 할당이 보장됩니다. 그러나 빌더 인스턴스의 메모리는 용량을 매우 작은 값 (예 : 1)으로 설정할 때까지 해제되지 않습니다. Capacity 속성의 기본값은 16입니다. 16을 사용하거나 (비효율적이지만) 용량을 두 번 설정하는 것을 고려할 수 있습니다.
- 메모리를 지우려면 1 또는 0으로 설정하십시오.
- 이를 복원하려면 원래 용량 값 (16과 다를 수 있음)으로 설정하십시오.
.NET 4.0에서는 호출 할 수 sb.Clear()있지만 이전 버전에서는 sb.Length = 0.
이 Clear()메서드는 .NET 4.0에 추가되었습니다.
새 StringBuilder를 만듭니다. 오래된 것은 가비지 수집이 가장 좋은 리소스 (예 : 최대 길이의 버퍼)를 유지합니다.
나는 당신이 조기 최적화를하고 있다고 생각합니다.
sb.Length=0;다른 개체를 만들고 GC가 결국 수집 할 수 있도록 다른 개체를 옆에 두는 것을 방지 하는 것이 가장 빠를 것입니다.
새로운 StringBuilder를 만드는 것이 메모리 문제에 가장 적합한 방법이라고 생각합니다. 설정 sb.Length은 속도 문제에 가장 적합한 샷이 될 것입니다 ..
MSDN의 커뮤니티 콘텐츠에서 :
stringbuilder를 파괴하지 않고 효과적으로 지우려면 다음을 사용하십시오.
someStringBuilder.length = 0; someStringBuilder.capacity = 0;이렇게하면 내용이 모두 파괴되고 크기가 0으로 조정됩니다. 위에서 언급했듯이 크기는 더 작은 애플리케이션에 영향을 줄 수 있습니다.
.NET Framework에서는 4 개의 새로운 메서드가 StringBuilder클래스 에 도입되었습니다 . 메소드 이름은 "Clear"입니다. 이 방법은 StringBuilder개체 에서 값이나 데이터를 지우거나 제거하는 데 도움이됩니다 .
여기에 대한 예가 있습니다.
System.Text.StringBuilder objSB = new System.Text.StringBuilder();
//Append values
objSB.Append("This is .Net Blog.");
objSB.Append("You can get latest C# Tips over here.");
//Display on screen
Response.Write(objSB.ToString());
Response.Write("<br/><br/>");
//Clear object using Clear method
objSB.Clear();
//Append another values
objSB.Append("This blog is very useful for .Net Beginners");
Response.Write("After Clear<br/><br/>");
//Display on screen
Response.Write(objSB.ToString());
메모리 사용량을 줄이려는 경우 CLR 프로파일 러를 사용하여 다른 사람들이 위에서 설명한 방법을 사용하여 수명주기 동안 StringBuilder 개체가 사용중인 메모리 양을 확인합니다. 그런 다음 선택한 옵션이 자신의 요구에 적합하고 필요한 리소스를 제공하고 있음을 스스로 만족시킬 수 있습니다.
그것을 지우는 가장 좋은 방법은를 사용하는 것 sb = new StringBuilder();입니다. 즉, 새로운 문자열 작성기 객체를 모두 만들면 더 좋을 것이라고 생각합니다.
편집하다
이것이 최선의 해결책이라는 것은 말할 필요도 없습니다.
public StringBuilder MakeString(IEnumerable<CoolType> list)
{
StringBuilder sb = new StringBuilder();
foreach(var whatever in list)
{
sb.Append("{0}", whatever);
}
}
var sb = MakeString(whateverList);
// Do stuff
// Clear stuff
sb = MakeString(whateverList2);
Just call Clear() method just set length = 0 , We can set Capacity = 0 also, if we want to save memory
public StringBuilder Clear() {
this.Length = 0;
return this;
}
Ref: In referencesource.microsoft.com
// P.S. to be ultra efficient
// make a good guess at the initial allocation too !!!!
int PerWhatever_SizeEstimate = 4; // a guess of average length... you known your data
StringBuilder sb = new StringBuilder( whateverlist.Length * PerWhatever_SizeEstimate);
// reallocation needed?
// if you want to be efficient speed and memory wise...
sb.Length = 0; // rest internal index but don't release/resize memory
// if a ...BIG... difference in size
if( whatever2.Length < whatever.Length * 2/3
|| whatever2.Length > whatever.Length * 1.5)
{
//scale capacity appropriately
sb.Capaciy = sb.Capacity * whatever2.Length / whatever.Length;
}
C# In A Nutshell To clear the contents of a StringBuilder, there are two ways:
- Set its
Lengthto zero:Setting a StringBuilder’s
Lengthtozerodoesn’t shrink its internal capacity. So, if the StringBuilder previously contained one million characters, it will continue to occupy around 2 MB of memory after zeroing its Length. - Instantiate a new one:
If you want to
release the memory, you must create a new StringBuilder and allow the old one to drop out of scope (and be garbage collected), with this approach you can solve the previous item problem.
참고URL : https://stackoverflow.com/questions/1709471/best-way-to-clear-contents-of-nets-stringbuilder
'Program Club' 카테고리의 다른 글
| 비트 마스크 (플래그) 열거 형이 너무 커지면 수행 할 작업 (0) | 2020.11.08 |
|---|---|
| 스타일의 차이 : IDictionary vs Dictionary (0) | 2020.11.07 |
| 라디오 버튼 그룹의 값 가져 오기 (0) | 2020.11.07 |
| com.sun.jdi.InvocationException이 메서드를 호출하는 동안 발생했습니다. (0) | 2020.11.07 |
| 다중 조각 활동에서 onContextItemSelected를 처리하는 방법은 무엇입니까? (0) | 2020.11.07 |