2016-07-20 8 views
2

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.

+1

Warum müssten Sie die Größe des Arrays annähern? – Azzaknight

+5

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. –

+0

@ 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

Antwort

0

Keine Vorabzuweisung erforderlich. Sie können, wie etwas tun (etwa - auf meinem Handy kann nicht Syntax überprüfen)

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

Ich bin nicht sicher-Zeichen, wenn der Syntax zu UTF8 von einzelnen erhalten Sie, dass weg lassen, wäre dies ein sein Array von 'Zeichen'. Wenn Sie die Konvertierung in Array nicht ausführen, ist dies eine Sequenz.

Um Ihre Frage zu beantworten, sind Zeichenfolgen nativ UTF16 und astring.characters.count ist sehr schnell. Achten Sie darauf, was Sie zählen, wenn eines der Multi-Graphem-Zeichen vorhanden sein könnte.

+0

Laut Dokument stellt Character einen erweiterten Graphem-Cluster dar. Wenn der interne String-Speicher UTF16 ist, beinhaltet "astring.characters.count" wahrscheinlich die gesamte Zeichenfolge und sollte langsam sein. – Zmey

+1

Nein, die Zählung wird direkt beibehalten. Es gibt einen großen Artikel darüber, wie schnell speichert Strings bei https://www.mikeash.com/pyblog/friday-qa-2015-11-06-why-is-swifts-string-api-so-hard.html – Feldur

+0

I Ich habe Benchmark-Daten zu der Frage hinzugefügt, es scheint, dass Charaktere von allen Ansichten am langsamsten sind. – Zmey