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()
함수를 사용할 수 없지만 StringBuilder
6-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
'UFO ET IT' 카테고리의 다른 글
jquery 클릭을 사용하여 앵커 onClick () 처리 (0) | 2020.11.21 |
---|---|
Mongoose에서 채우기 후 쿼리 (0) | 2020.11.21 |
IDEA에서 단일 푸시에 로컬 커밋 그룹을 결합하는 방법은 무엇입니까? (0) | 2020.11.21 |
AngularJS : 체크 박스 상태 반전 (0) | 2020.11.20 |
Angular ui-router는 ui-view가 아닌 맨 위로 스크롤합니다. (0) | 2020.11.20 |