2016-07-20 4 views
2

문자열 배열을 사용하고이 문자열의 utf8 표현을 utf8 char 배열로 연결하는 print() 스타일 함수가 있습니다. 그래서 미리 할당하기 위해 배열의 크기를 근사해야합니다.Swift에서의 문자열 연산의 복잡성

질문 :

1) 문자열에 다른보기를 작성의 복잡성 무엇입니까? (string.characters, string.utf8).

2)보기가 생성 된 후 이러한보기에서 엔티티를 계산하는 복잡도는 얼마나됩니까? (string.characters.count, string.utf8.count)

어느 것이 더 빠를 것입니까? 합계 string.utf8.count -s 또는 string.characters.count * 4? 나는 모든 문자가 4 바이트는 아니지만 출력 배열 크기를 근사화하기에는 아마도 충분하다고 생각한다.

UPD : 일부 벤치 마크 :

let s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." 

for _ in 0...1000000 { c += s.characters.count } 
for _ in 0...1000000 { c += s.utf8.count } 
for _ in 0...1000000 { c += s.utf16.count } 

s.characters.count: 5.55736202001572 seconds. 
s.unicodeScalars.count: 2.87764900922775 seconds. 
s.utf8.count: 0.901157021522522 seconds. 
s.utf16.count: 0.214971005916595 seconds. 

유니 코드 문자열 :

let s = "☁ ☂ ☃ ☄ ★ ☆ ☇ ☈ ☉ ☊ ☋ ☌ ☍ ☎ ☏ ☐ ☑ ☒ ☓ ☚ ☛ ☜ ☝ ☞ ☟☠ ☡ ☢ ☣ ☤ ☥ ☦ ☧ ☨ ☩ ☪ ☫ ☬ ☭ ☮ ☯ ☰ ☱ ☲ ☳ ☴ ☵ ☶ ☷ ☸ ☹ ☺ ☻ ☼ ☽ ☾ ☿ ♀ ♁ ♂ ♃ ♄ ♅ ♆ ♇ ♈ ♉ ♊ ♋ ♌ ♍ ♎ ♏ ♐ ♑ ♒ ♓ ♔ ♕ ♖ ♗ ♘ ♙ ♚ ♛ ♜ ♝ ♞ ♟ ♠ ♡ ♢ ♣ ♤ ♥ ♦ ♧ ♨ ♩ ♪ ♫ ♬ ♭ ♮ ♯" 

s.characters.count: 9.24248600006104 seconds. 
s.unicodeScalars.count: 4.10243701934814 seconds. 
s.utf8.count: 2.78127604722977 seconds. 
s.utf16.count: 0.210725963115692 seconds. 

더 오래 유니 코드 문자열 :

let s = "Lorem ipsum dolor sit amet Лорем ипсум долор сит амет 123456789    ☺                 ☁ ☂ ☃ ☄ ★ ☆ ☇ ☈ ☉ ☊ ☋ ☌ ☍ ☎ ☏ ☐ ☑ ☒ ☓ ☚ ☛ ☜ ☝ ☞ ☟☠ ☡ ☢ ☣ ☤ ☥ ☦ ☧ ☨ ☩ ☪ ☫ ☬ ☭ ☮ ☯ ☰ ☱ ☲ ☳ ☴ ☵ ☶ ☷ ☸ ☹ ☺ ☻ ☼ ☽ ☾ ☿ ♀ ♁ ♂ ♃ ♄ ♅ ♆ ♇ ♈ ♉ ♊ ♋ ♌ ♍ ♎ ♏ ♐ ♑ ♒ ♓ ♔ ♕ ♖ ♗ ♘ ♙ ♚ ♛ ♜ ♝ ♞ ♟ ♠ ♡ ♢ ♣ ♤ ♥ ♦ ♧ ♨ ♩ ♪ ♫ ♬ ♭ ♮ ♯" 

s.characters.count: 21.852580010891 seconds. 
s.unicodeScalars.count: 9.216412961483 seconds. 
s.utf8.count: 7.34296900033951 seconds. 
s.utf16.count: 0.21273398399353 seconds. 

나는 또한 대용량 데이터 세트에서 테스트 한 (s * 100000 회) - s.utf16.count은 동일한 성능을 유지합니다.

그래서 s.utf16.count 만 O (1)로 나타납니다. 다른 사람은 characters이 가장 느린 O (n)입니다.

+1

왜 배열 크기를 근사해야합니까? – Azzaknight

+5

전체 * "어느 쪽이 더 빠를 것인가"* 질문에는 적어도 자신이 차이를 측정 한 시도가 포함되어야합니다. 앱의 해당 부분에서 보낸 시간이 전혀 관련이 없다면 아이디어를 얻을 수도 있습니다. –

+0

@ martin-r 동의, 나는 벤치마킹을하고 질문을 업데이 트합니다. 나는 그들 중 어느 것이 O (1)이고 어느 것이 O (n)인지 알고 싶었다. – Zmey

답변

0

미리 할당 할 필요가 없습니다. 당신은 같은 것을 할 수있는 (약을 - 내 전화, 구문을 확인할 수 없습니다) 당신이를 떠나

Array(stringArray.joinWithSeparator("").characters.utf8) 

나는 개인에서 UTF8 얻을 수있는 구문을 잘 모르겠어요 경우 문자를-, 이것은 일 것입니다 배열 '문자'. 배열로 변환하지 않으면 시퀀스입니다.

질문에 대답하기 위해 문자열은 기본적으로 UTF16이며 astring.characters.count는 매우 빠릅니다. 다중 - 글자 문자가 존재할 수 있다고 생각하면주의하십시오.

+0

docs에 따르면 Character는 확장 된 grapheme 클러스터를 나타냅니다. 내부 문자열 저장소가 UTF16 인 경우,'astring.characters.count'는 아마 전체 문자열을 반복하는 것을 포함하므로 느려야합니까? – Zmey

+1

아니요, 카운트가 직접 유지됩니다. https://www.mikeash.com/pyblog/friday-qa-2015-11-06-why-is-swifts-string-api-so-hard.html – Feldur

+0

I에서 빠른 상점 문자열에 대한 훌륭한 기사가 있습니다. 질문에 벤치 마크 데이터를 추가 했으므로 캐릭터가 모든 의견 중에서 가장 느린 것으로 보입니다. – Zmey