C\#에서 StringBuilder 류 의 효율 성과 String 과 의 대 비 를 분석 합 니 다.

3496 단어 C#StringBuilderString
C\#에 서 는 문자열 연결 을 처리 할 때 StringBuilder 를 사용 하 는 효율 이 하 드 연결 문자열 보다 훨씬 높 습 니 다.도대체 얼마나 높 은 지 아래 와 같다.

static void Main( string[] args )
{
 string str1 = string.Empty;
 Stopwatch sw1 = new Stopwatch();
 sw1.Start();
 for ( int i = 0; i < 10000; i++ )
 {
 str1 = str1 + i.ToString();
 }
 sw1.Stop();
 Console.WriteLine( "           :" + sw1.ElapsedMilliseconds + "  " );
 StringBuilder str2 = new StringBuilder( 10000 );
 Stopwatch sw2 = new Stopwatch();
 sw2.Start();
 for ( int i = 0; i < 10000; i++ )
 {
 str2.Append( i.ToString() );
 }
 sw2.Stop();
 Console.WriteLine( "  StringBuilder      :" + sw2.ElapsedMilliseconds + "  " );
 Console.ReadKey();
}

위의 코드 가 실 행 된 효 과 는 다음 과 같 습 니 다.
2016518151713376.png (323×59)
string 형식의 특별한 점 은 우리 가 값 형식 을 사용 하 는 것 처럼 string 형식 을 사용 할 수 있다 는 것 입 니 다.실제로 string 은 참조 형식 입 니 다.인용 형식 인 만큼 CLR 은 string 형식 을 위탁 관리 더미 에 저장 합 니 다.str1=str1+i.ToString()을 사용 할 때;연결 을 진행 합 니 다.string 형식의 항상성 때문에 str 1 이 메모리 에 있 는 주 소 를 바 꾸 지 않 고 위탁 관리 더미 에 다른 문자열 대상 을 만 들 었 습 니 다.이렇게 10000 번 을 맞 추 면 10000 개의 string 형식 대상 을 만 들 었 고 효율 이 떨 어 질 수 밖 에 없습니다.
한편,StringBuilder 는 메모리 에 연속 적 인 메모 리 를 열 것 입 니 다.문자열 을 추가 하 는 것 은 실제 적 으로 같은 메모리 에 대한 수정 이기 때문에 효율 이 높 습 니 다.
물론 하 드 패 치 문자열 을 사용 하 는 지,StringBuilder 를 사용 하 는 지 는 절대적 인 것 이 아니 라 상황 을 봐 야 합 니 다.맞 춤 법 문자열 이 적은 경우 에는 당연히 문자열 을 딱딱 하 게 맞 추 면 된다.
string 과 stringBuilder 의 차 이 를 깊이 파고들다
String 대상 은 바 꿀 수 없습니다.System.string 클래스 의 방법 중 하 나 를 사용 하거나 연산 을 할 때마다(예 를 들 어 할당,연결 등)메모리 에 새 문자열 대상 을 만 듭 니 다.새 대상 에 메모리 공간 을 할당 해 야 합 니 다.StringBuilder 는 그렇지 않 습 니 다.문자열 에 대한 중복 수정 작업 이 필요 할 때 새로운 String 대상 을 만 드 는 것 과 관련 된 시스템 비용 이 매우 비 쌀 수 있 습 니 다.새 대상 을 만 들 지 않 고 문자열 을 수정 하려 면 System.Text.String Builder 류 를 사용 할 수 있 습 니 다.예 를 들 어 하나의 순환 에서 많은 문자열 을 연결 할 때 StringBuilder 클래스 를 사용 하면 성능 을 향상 시 킬 수 있 습 니 다.
String 타 입 대상 의 특징:
1.인용 형식 입 니 다.더미 에 메모 리 를 할당 합 니 다.
2.연산 시 새로운 인 스 턴 스 생 성
3.String 대상 생 성 시 변경 불가(Immutable)
4.같은 연산 자 정의(==와!=)String 대상 의 값 을 비교 하기 위 한 것 입 니 다(인용 이 아 닙 니 다)
문자열 대상 은'가 변 적 이지 않 음'이라는 것 을 잘 알 고 있 습 니 다.
문자열 을 조작 하 는 방법 은 실제 적 으로 새로운 문자열 대상 을 되 돌려 줍 니 다.
앞의 예제 에서 s1 과 s2 의 내용 을 연결 하여 하나의 문자열 을 구성 할 때'orange'와'red'를 포함 하 는 두 문자열 은 변 하지 않 습 니 다.+=연산 자 는 조합 내용 을 포함 하 는 새 문자열 을 만 듭 니 다.결 과 는 s1 입 니 다.현재 완전히 다른 문자열 을 참조 하고 있 습 니 다."orange"만 포함 하 는 문자열 은 여전히 존재 하지만,s1 에 연결 하면 더 이상 인용 되 지 않 습 니 다.
대량의 문자열 을 더 할 때 s1 과 같은 인용 되 지 않 아 자원 의 큰 낭 비 를 초래 할 수 있다.
여러분,조심 하 세 요.

string stringValue = this.m_StringValue;

internal volatile string m_StringValue;

여기까지 쓰 려 면 volatile 을 본 사람 이 있어 야 합 니 다.무슨 뜻 인지 모 르 겠 지만 대충 말씀 드 리 겠 습 니 다.
volatile 키 워드 는 스 레 드 간 데이터 동기 화 를 실현 합 니 다.volatile 로 수 정 된 변 수 는'주'메모리 영역 과 다른 변 수 를 복사 할 수 없습니다.
다시 말 하면 하나의 변 수 는 volatile 의 수식 을 거 친 후에 모든 스 레 드 에서 동기 화 되 어야 합 니 다.모든 스 레 드 에서 값 을 바 꾸 었 습 니 다.모든 스 레 드 는 즉시
같은 값 을 가 져 왔 습 니 다.당연히 volatile 수식 변 수 는 일반 변수 보다 자원 을 더 많이 소모 합 니 다.스 레 드 는 자신 만 의 것 이 있 기 때 문 입 니 다.
변수 복사 가 더욱 효율 적 입 니 다.

this.NeedsAllocation(stringValue, requiredLength)
필요 할 때 만 재배 치 를 한다.
분배 공간 과 스 레 드 의 사용 에 있어 서 StringBuilder 는 String 보다 높 을 것 입 니 다.그러나 전 제 는 사용 빈도 가 비교적 높 은 경우 입 니 다.

좋은 웹페이지 즐겨찾기