UFO ET IT

StringBuilder를 현명하게 사용하는 방법?

ufoet 2020. 11. 21. 08:36
반응형

StringBuilder를 현명하게 사용하는 방법?


StringBuilder먼저 클래스 사용에 대해 약간 혼란스러워합니다 .

string객체 연결 작업은 항상 기존의에서 새로운 객체를 생성 string하고 새로운 데이터. StringBuilder목적은 새로운 데이터의 연결을 수용하기위한 버퍼를 유지한다. 여유 공간이 있으면 새 데이터가 버퍼 끝에 추가됩니다. 그렇지 않으면 새롭고 큰 버퍼가 할당되고 원래 버퍼의 데이터가 새 버퍼로 복사 된 다음 새 데이터가 새 버퍼에 추가됩니다.

그러나 StringBuilder인스턴스를 새로 만드는 것을 피하기 위해 인스턴스를 만드는 것은 어디에 String있습니까? "일대일"거래처럼 들립니다.

static void Main(string[] args)
{
    String foo = "123";
    using (StringBuilder sb = new StringBuilder(foo)) // also sb isn't disposable, so there will be error
    {
        sb.Append("456");
        foo = sb.ToString();
    }

    Console.WriteLine(foo);
    Console.ReadKey();
}

그냥 사용하면 안되는 이유

+=

편집 : 좋아, 나는 이제 하나의 인스턴스를 재사용하는 방법을StringBuilder알고 있지만 (코드 표준에 맞는지 아직 모르겠다), 이것은 하나만 사용할 가치가string없습니까?


s 와 같은 변경 불가능한 구조를 수정 string하려면 구조를 복사하여 더 많은 메모리를 소비하고 응용 프로그램의 실행 시간을 늦춰야합니다 (또한 GC시간 증가 등).

StringBuilder 조작을 위해 동일한 가변 객체를 사용하여이 문제를 해결합니다.

하나:

string컴파일 시간을 다음과 같이 연결할 때 :

string myString = "123";
myString += "234";
myString += "345";

실제로 다음과 같이 컴파일됩니다.

string myString = string.Concat("123", "234", "345");

이 함수는 함수에 들어가는 s StringBuilder의 수가 string알려진 작업보다 빠릅니다 .

따라서 컴파일 타임에 알려진 string연결의 경우 string.Concat().

string다음과 같은 경우 알 수없는 좋아요 :

string myString = "123";
if (Console.ReadLine() == "a")
{
    myString += "234";
}
myString += "345";

이제 컴파일러는 string.Concat()함수를 사용할 수 없지만 StringBuilder6-7 이상으로 연결이 완료 될 때만 시간과 메모리 소비면에서 더 효율적인 것으로 보입니다 strings.

나쁜 사용법 :

StringBuilder myString = new StringBuilder("123");
myString.Append("234");
myString.Append("345");

정밀한 사용법 (사용 된 참고 if) :

StringBuilder myString = new StringBuilder("123");
if (Console.ReadLine() == "a")
{
    myString.Append("234");
}
myString.Append("345");

모범 사례 사용 ( while루프가 사용됨) :

StringBuilder myString = new StringBuilder("123");
while (Console.ReadLine() == "a")
{
    myString.Append("234"); //Average loop times 4~ or more
}
myString.Append("345");

A string불변 클래스 입니다. 수정할 수 없으며 새 strings.

So when you write result += a; you have three separate strings in memory at that point: a, the old value of result and the new value. Of course this is absolutely fine if you only concatenate a limited number of strings. If you do that in a for loop iterating over a large collection it can become a problem.

The StringBuilder class offers improved performance in these cases. Instead of creating new strings to store the result of the concatenation it uses the same object. So if you use stringBuilder.Append(a); you never have the equivalent of the "old value of result".


This memory efficiency comes with a price of course. When only concatenating a small number of strings a StringBuilder is often less efficienct with regards to speed since it had more overhead compared to the immutable string class.


One thing to keep in mind is that when you need the intermediate strings then StringBuilder can become less efficient since calling .ToString() on it creates a new copy of the string.


The reason is because strings are immutable. When concatenating a string you create a new string. So, when you need to concatenate many strings you create a lot of objects. This doesn't cost much in terms of memory, as each string is used once. But it does give extra work for the GC.

StringBuilder however uses the same object each time, but it does so at the expense of ease of use.

참고URL : https://stackoverflow.com/questions/21644658/how-to-use-stringbuilder-wisely

반응형