schneller strlen?

7

Typisch strlen() traversiert vom ersten Zeichen bis es %code% findet. Dazu müssen Sie jedes einzelne Zeichen durchlaufen. Im Algorithmus Sinn, seine O (N).

Gibt es einen schnelleren Weg, dies zu tun, wenn die Eingabe vage definiert ist? Wie: Die Länge wäre weniger als 50 oder die Länge wäre ungefähr 200 Zeichen.

Ich dachte an Nachschlage-Blöcke und alle, aber habe keine Optimierung erhalten.

    
Jack 21.11.2009, 07:08
quelle

7 Antworten

17

Tatsächlich ist die Implementierung von glibc von strlen ein interessantes Beispiel für den Vektorisierungsansatz. Es ist insofern eigenartig, als es keine Vektorbefehle verwendet, sondern einen Weg findet, nur gewöhnliche Befehle für 32- oder 64-Bit-Wörter aus dem Puffer zu verwenden.

    
Pascal Cuoq 21.11.2009, 09:39
quelle
22

Sicher. Verfolgen Sie die Länge, während Sie in die Zeichenfolge schreiben.

    
Bob Aman 21.11.2009 07:12
quelle
9

Wenn Ihre Zeichenfolge eine bekannte Mindestlänge hat, können Sie natürlich Ihre Suche an dieser Position beginnen.

Darüber hinaus gibt es nicht wirklich etwas, was Sie tun können; Wenn Sie versuchen, etwas cleveres zu tun und ein Byte strlen zu finden, müssen Sie immer noch jedes Byte zwischen dem Anfang der Zeichenfolge und diesem Punkt überprüfen, um sicherzustellen, dass es keine frühere strlen gab.

Das soll nicht heißen, dass %code% nicht optimiert werden kann. Es kann pipelined sein, und es kann gemacht werden, um Wortgrößen- oder Vektorstücke mit jedem Vergleich zu verarbeiten. Bei den meisten Architekturen führt eine Kombination dieser und anderer Ansätze zu einer wesentlichen Beschleunigung des konstanten Faktors gegenüber einer naiven Bytevergleichsschleife. Auf den meisten ausgereiften Plattformen ist das System %code% bereits unter Verwendung dieser Techniken implementiert.

    
Stephen Canon 21.11.2009 07:14
quelle
6

Die kurze Antwort: Nein.

Die längere Antwort: Glauben Sie wirklich, dass, wenn es einen schnelleren Weg gäbe, die String-Länge für Barebones C-Strings zu überprüfen, etwas, wie es üblicherweise in der C-String-Bibliothek verwendet wird, es nicht schon eingebaut hätte?

Ohne zusätzliches Wissen über eine Zeichenkette müssen Sie jedes Zeichen überprüfen. Wenn Sie bereit sind, diese zusätzlichen Informationen beizubehalten, können Sie ein struct erstellen, das die Länge als ein Feld in der Struktur speichert (zusätzlich zu dem eigentlichen Zeichenarray / Zeiger für die Zeichenfolge). In diesem Fall könnten Sie dann machen die Konstante für die konstante Länge der Länge, müsste dieses Feld jedoch jedes Mal aktualisieren, wenn Sie die Zeichenfolge geändert haben.

    
Amber 21.11.2009 07:12
quelle
4

Jack,

strlen arbeitet nach der Endung '\ 0', hier ist eine Implementierung aus OpenBSD:

%Vor%

Beachten Sie, dass Sie wissen, dass die Länge etwa 200 Zeichen beträgt, wie Sie gesagt haben. Angenommen, du fängst bei 200 an und fährst für '\ 0' nach oben und unten. Du hast eins bei 204 gefunden, was bedeutet das? Dass die Saite 204 Zeichen lang ist? NEIN! Es könnte vorher mit einem anderen '\ 0' enden und alles, was du getan hast, war außerhalb der Grenzen zu sehen.

    
Eli Bendersky 21.11.2009 07:23
quelle
3

Sie können versuchen, die Vektorisierung zu verwenden. Nicht sicher, ob der Compiler es ausführen kann, aber ich habe es manuell gemacht (mit intrinsics). Aber es könnte dir nur für lange Strings helfen.

Verwenden Sie STL-Strings, es ist sicherer und std :: string-Klasse enthält ihre Länge.

    
Elalfer 21.11.2009 07:14
quelle
3

Holen Sie sich einen Core i7 Prozessor.

Core i7 wird mit dem Befehlssatz SSE 4.2 geliefert. Intel hat vier zusätzliche Vektoranweisungen hinzugefügt, um strlen und verwandte Suchaufgaben zu beschleunigen.

Hier sind einige interessante Gedanken zu den neuen Anweisungen:

Ссылка

    
Nils Pipenbrinck 21.11.2009 11:55
quelle

Tags und Links