Ich habe print() - Stil-Funktion, die ein Array von Strings und verkettet utf8 Darstellungen dieser Strings zu utf8 Char-Array. Also muss ich die Größe des Arrays approximieren, um es vorzubelegen.Komplexität der String-Operationen in Swift
Die Frage ist:
1) Was ist die Komplexität auf einem String verschiedene Ansichten zu schaffen? (string.characters
, string.utf8
).
2) Wie komplex ist das Zählen der Entitäten in diesen Ansichten, nachdem die Ansicht erstellt wurde? (string.characters.count
, string.utf8.count
)
Welches wäre schneller: summieren string.utf8.count
-s oder string.characters.count * 4
? Ich verstehe, dass nicht jedes Zeichen 4 Bytes ist, aber für die Approximation der Ausgangs-Array-Größe ist dies wahrscheinlich gut genug.
UPD: Einige Benchmarks:
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.
Unicode-String:
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.
Noch längere Unicode-String:
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.
ich auch auf große Datenmengen getestet haben (s * 100000
mal) - s.utf16.count
behält die gleiche Leistung bei.
So scheint es, dass nur sutf16.count ist O (1). Andere sind O (n), wobei characters
die langsamste ist.
Warum müssten Sie die Größe des Arrays annähern? – Azzaknight
Alle * "Was wäre schneller" * Fragen sollten mindestens einen Versuch enthalten, bei dem Sie den Unterschied selbst gemessen haben. Das würde dir auch eine Idee geben, ob die Zeit, die du in diesem Teil deiner App verbringst, überhaupt relevant ist. –
@ martin-r Einverstanden, ich werde das Benchmarking durchführen und die Frage aktualisieren. Ich wollte wissen, welcher von ihnen O (1) und welcher O (n) ist. – Zmey