문자열 배열을 사용하고이 문자열의 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)입니다.
왜 배열 크기를 근사해야합니까? – Azzaknight
전체 * "어느 쪽이 더 빠를 것인가"* 질문에는 적어도 자신이 차이를 측정 한 시도가 포함되어야합니다. 앱의 해당 부분에서 보낸 시간이 전혀 관련이 없다면 아이디어를 얻을 수도 있습니다. –
@ martin-r 동의, 나는 벤치마킹을하고 질문을 업데이 트합니다. 나는 그들 중 어느 것이 O (1)이고 어느 것이 O (n)인지 알고 싶었다. – Zmey