TL;DR

  • SimdUnicode는 잘못된 UTF-16 문자열을 고치거나 유효성을 검사할 때 SIMD를 활용하며, 입력이 유효한 경우 복사에 가까운 속도를 냄.
  • 기본 다국어 평면 밖의 문자는 하이 서로게이트(U+D800~U+DBFF)와 로우 서로게이트(U+DC00~U+DFFF) 한 쌍으로 표현되며, 짝이 맞지 않는 서로게이트는 잘못된 문자열을 구성함.
  • ToWellFormed()는 단독 서로게이트를 U+FFFD로 바꾸며, 입력이 이미 유효하면 같은 인스턴스를 반환해 메모리 할당이 없음.
  • Xeon Gold 6548N에서 라틴 문자 유효성 검사는 69GB/s, 이모지 입력 검사는 53GB/s를 기록했으며, 기존 런타임 검색은 각각 33GB/s, 0.4GB/s를 기록함.
  • M4 Max에서도 결과는 비슷하며, ToWellFormed()의 버퍼 방식은 입력이 유효할 때 사실상 메모리 복사와 같아 전반적으로 복사 속도에 근접함.

UTF-16 문자열의 유효성

  • C# 문자열은 UTF-16이며 대부분의 문자는 16비트 코드 단위 하나로 표현됨. 이모지를 포함해 기본 다국어 평면 밖의 문자는 하이 서로게이트와 로우 서로게이트 두 개를 사용함.
  • 서로게이트의 이웃 문자가 올바르지 않거나 이웃이 없으면 문자열이 잘못된 형식임. 잘못된 문자열을 디스크나 네트워크로 보내는 것은 나쁜 관행임.
  • JavaScript에는 단독 서로게이트를 U+FFFD로 바꾸는 String.prototype.toWellFormed()와 교체가 필요한지 알려주는 isWellFormed()가 있음.

SimdUnicode의 C# 기능

  • 두 함수를 C# 라이브러리 SimdUnicode에 추가했으며, 변경 사항은 풀 리퀘스트 54에 포함됨. 알고리즘은 JavaScript 엔진 V8에 기여한 것과 동일하며 Chrome도 이미 같은 방식으로 문자열을 고침.
  • UTF16.ToWellFormed(input)은 입력이 이미 유효하면 같은 인스턴스를 반환하며, 이 경우 메모리 할당이 없음. UTF16.IsWellFormed(span)은 문자열의 유효성을 확인함.
  • 문자열을 고칠 때는 잘못된 입력을 대체 문자 U+FFFD로 바꿈.
  • 기존 C# 방식은 입력을 출력 버퍼에 복사한 뒤 다음 단독 서로게이트를 찾아 교체하는 과정임. 다음 오류를 찾을 때는 U+D800~U+DFFF 범위를 검색하고, 유효한 하이·로우 서로게이트 쌍은 건너뜀.
  • SimdUnicode도 데이터 병렬 처리를 사용함. 프로세서의 단일 명령 다중 데이터(SIMD) 명령은 여러 값을 한 번에 비교할 수 있음.
  • 최근 AMD와 Intel의 x64 프로세서는 ARM 칩보다 데이터 병렬 처리 성능이 높지만, 두 아키텍처 모두 강력한 명령어를 갖춤.

성능 측정

  • Xeon의 AVX-512 환경에서 라틴 문자 유효성 검사는 69GB/s로, IndexOfAnyInRange의 33GB/s보다 빠름.
  • 이모지 입력은 유효한 문자열이며 서로게이트 쌍만으로 구성됨. 런타임 검색 속도는 0.4GB/s로 떨어진 반면 SimdUnicode의 검사는 53GB/s를 기록함.
  • M4 Max에서도 비슷한 결과를 얻었으며, Intel 측정 결과와 비교하면 차이는 다소 덜 두드러짐.
  • 유효성 검사는 첫 번째 단독 서로게이트에서 반환할 수 있음. ToWellFormed()의 버퍼 방식은 모든 코드 단위를 쓰며, 각 위치에는 입력의 복사본 또는 U+FFFD가 들어감.
  • 입력이 유효하면 버퍼 방식은 사실상 메모리 복사이므로 복사 성능과 비교할 수 있음. 전반적으로 복사와 거의 같은 속도를 냄.

측정 환경과 참고 자료

  • 사용 환경은 Linux의 .NET SDK 10.0.400, macOS의 .NET SDK 10.0.103, Intel Xeon Gold 6548N(Emerald Rapids), Apple M4 Max임.
  • 참고 논문: Clausecker, R., & Lemire, D. (2026). “Fixing ill-formed UTF-16 strings with SIMD instructions.” *Software: Practice and Experience*. (arXiv)
  • 소스 코드.
  • Daniel Lemire, “How fast can you fix a UTF-16 string in C#?,” *Daniel Lemire's blog*, 2026년 9월 26일. BibTeX
  • Daniel Lemire는 퀘벡대학교(TELUQ) 컴퓨터과학 교수임.