에서 안전하지 않은 문자열 생성이 구문은 성능이 중요한 섹션의 일부인 고성능 코드 작업 중입니다.char []
이 어떤 부분에서 일어나는 것입니다 :
string
은 '스캔'하고 메타 데이터를 효율적으로 저장된다.- 기본 문자열의이 메타 데이터 청크를 기준으로
char[][]
으로 구분됩니다. char[][]
은string[]
으로 전송해야합니다.
지금은 new string(char[])
으로 전화를 걸 수 있지만 그 결과는 복사해야합니다.
나는이 여분의 복사 단계가 일어나지 않도록하려면 문자열의 내부 버퍼에 직접 쓸 수 있어야합니다. 이 작업은 안전하지 않을 수 있지만 (오버플로, 앞으로의 호환성과 같은 많은 의미가 있음을 알고 있습니다.)
나는 이것을 달성하는 몇 가지 방법을 보았지만 아무도 정말로 만족하지 않는다.
아무에게도 이것을 달성하는 방법에 대한 진정한 제안이 있습니까?
추가 정보 :
실제 프로세스가 char[]
로 전환 포함되지 않습니다 반드시, 그것은 사실상 '다중 문자열'동작입니다. 3 개의 인덱스와 길이가 추가됩니다.
StringBuilder
은 작은 수의 concat에 대해 너무 많은 오버 헤드가 있습니다.
는 편집 : 때문에 정확히 내가 궁금한 건 무엇의 일부 모호한 측면
은, 내가 그것을 재구성 할 수 있습니다.
이 발생하는 것입니다 :
- 홈페이지 문자열 색인이 생성됩니다.
- 주 문자열의 일부가
char[]
에 복사됩니다. char[]
은string
으로 변환됩니다.- 홈페이지 문자열 색인 : 내가하고 싶은 무엇
은 결과, 2 단계 및 3을 병합합니다.
- 주 문자열의 일부가
string
에 복사됩니다 (그리고fixed
키워드를 올바르게 사용하여 처리하는 동안 GC가 손을 뗄 수 있습니다).
가되어 음은 그 I 수없는 변경이 외부 라이브러리이고, 프로젝트 (역 호환성)에 의존하기 때문에, [] 문자열의 출력 형식.
당신은 실제로이 모든 후 문자열과 관련이 있습니까? 즉, 다시 복사하지 않고'string []'에 매핑하는 방법을 찾는 대신,'char []'로 가져 와서 그 위치와 길이의'int, int' 쌍을 저장할 수 있습니까? 원하는 부분 배열을 참조하여 필요할 때마다 부분 문자열을 꺼내십시오. –
나는 당신이 여기에서 어떤 코드를 향상 시키려고하는지 잘 모르겠다. –
문자열 클래스는 특별합니다. 정의에 따르면 불변이고 복사가 포함됩니다. 이를 피하려고하는 것은 GC 및 다른 관리 코드 (문자열이 풀링 됨)에 문제가 있는지 묻는 것입니다. – Nikki9696