Frage

Ich habe in einem anderen Code Sekunde gesehen und ich nehme diese Länge Vergleich getan hat Code Produktivität zu erhöhen. Es wurde in einem Parser für eine Skriptsprache mit einem bestimmten Wörterbuch verwendet: Worte mit 4 bis 24 Buchstaben lang mit dem Durchschnitt von 7-8 lettets sind, umfasst Alphabet 26 lateinische Buchstaben plus „@“, „$“ und „_“.

Länge Vergleich wurde verwendet Operator == zu entkommen mit STL-Strings arbeiten, die offensichtlich mehr Zeit dann einfach integer Vergleich nehmen. Aber in der gleichen Zeit Anfangsbuchstaben Verteilung im Wörterbuch gegeben ist einfach breiter ist als eine Verteilung von Wörtern Größe, also zwei ersten Buchstaben des Vergleichens Strings werden in der Regel häufiger anders sein, als die Größen dieser Saiten. Das macht Länge Vergleich überflüssig.

Ich habe einige Tests läuft und das ist, was ich herausgefunden haben: Beim Testen zwei zufällige Zeichenfolge Vergleich Millionen Mal, zweiter Weg ist viel schneller, so Länge Vergleich scheint hilfreich zu sein. Aber in einem Arbeitsprojekt funktioniert es noch langsamer in einem Debug-Modus und insufficiantly schneller in einem Release-Modus.

Also, meine Frage ist: Warum Länge Vergleich den Vergleich befestigen kann und warum es sie verlangsamen

?

UPD:. Ich weiß nicht, wie die zweite Möglichkeit, entweder, aber es war aus einem bestimmten Grund geschehen ist, nehme ich an, und ich frage mich, was ist das Grund

UPD2: Im Ernst, die Frage ist nicht, wie man am besten zu tun. Ich benutze nicht einmal STL-Strings in diesem Fall mehr. Es ist kein Wunder, dass Länge Vergleich ist unnötig und falsch usw. Das Wunder ist - es neigt dazu, wirklich in einem bestimmten Test etwas besser zu arbeiten. Wie ist das möglich?

War es hilfreich?

Lösung

In Ihrem Zufallstest könnten die Saiten lang genug gewesen, den Gewinn zu zeigen, während in Ihrem realen Fall, dass Sie mit kürzeren Saiten und dem konstanten Faktor von zwei Vergleichen Offset wird von keiner Verstärkung umgehen können nicht die Durchführung den String-Vergleich Teil der Test.

Andere Tipps

Wenn es darauf ankommt, davon ausgehen, dass Ihre Bibliothek tat es bereits. Do not mess up Ihren Code auf diese Weise für Mikro-Optimierungen, wenn es wirklich wichtig ist.

Wann kann Kurzschließ von Vorteil sein

Kurzschluss Optimierungen können hilfreich sein, nur dann, wenn:

  • die Kosten des Vergleichs ist gering im Vergleich zu den Kosten des gesamten Tests
  • der Vergleich führt oft zu Kurzschlüssen

Mathematisch lassen S Kosten von Kurzschlüssen Zustand, F Kosten für vollen Zustand sein, und P sein Prozent der Fälle, in denen Kurzschließ geschieht (Voll Zustand ist nicht erforderlich).

Die durchschnittlichen Kosten der ursprünglichen Fall (kein Kurzschluss) ist F

Die durchschnittlich Kosten von Kurzschlüssen Optimierung ist S + F * (1-P)

Wenn daher die Optimierung überhaupt keinen Nutzen hat, gelten folgende müssen:

S + F * (1-P)

d.

S

String Vergleich Kosten

Weitere Sie schreiben:

, die offensichtlich mehr Zeit dann einfach integer Vergleich nimmt.

Das ist überhaupt nicht klar. Der String-Vergleich beendet, wenn der erste Unterschied gefunden wird, also je nachdem, was Sie Prozess reiht, es auf den ersten oder zweiten Zeichen in wiegenden Mehrzahl der Fälle enden. Darüber hinaus kann der Vergleich auch durch ersten Vergleich DWORDS (4 Zeichen auf einmal) für längere Strings optimiert werden, solange es genügend Daten in beiden Strings ist.

Ihr Fall

Der wesentliche Unterschied zwischen zufälligen Testdaten und Scripting-Analyse ist die realen Daten weit von zufällig sind. Der Parser ist am wahrscheinlichsten, deterministisch, und wenn sie paßt, ist es nicht mehr vergleichen. Auch die Schriftdaten sind nicht zufällig - einige Schlüsselwörter sind wahrscheinlich viel mehr als andere verwendet werden. Wenn der Parser so konstruiert ist, prüft es am häufigsten verwendeten Schlüsselwort ersten, eine überraschend hohe Anzahl von Vergleich der vollen müssen vergleichen getan werden, als Voll vergleichen immer getan werden muss, wenn String passen.

Im Allgemeinen sollten Sie dies dem STL verlassen und sich keine Sorgen darüber.

Wenn aber dies ist ein Bereich, den Sie optimieren müssen (was ich bezweifle ernsthaft), und wenn Sie den Brief Verteilung / Längenverteilung von Saiten verstehen, könnten Sie eine neue Klasse von String leiten und den Operator == überlasten die Gleichheit Test auf die effizienteste Art und Weise für Ihre Anwendung auszuführen. (Länge zuerst, erstes Zeichen zuerst, vorwärts, rückwärts, was auch immer).

Das wäre besser als die ‚Optimierung‘, die im gesamten Code verteilt ist.

Die Umsetzung des std :: string operator == hat keine Möglichkeit zu wissen, ob es schneller sein, würde die Länge ersten oder starten Überprüfung Zeichen zu überprüfen. Offensichtlich die Länge Überprüfung ist eine Verschwendung für Streicher von gleicher Länge. Daher sind verschiedene Implementierungen von STL wahrscheinlich anders auszuführen.

setzen nur die explizite Länge Check-in als eine endgültige Optimierung (eindeutig als solche kommentiert), und nur, wenn Ihr Profiler bestätigt den Nutzen.

Länge Vergleich macht keinen Sinn für mich .. mit dem Vergleichsoperator ist genug

Feuer Ihre Implementierung von STL. Es sollte keine Rolle spielen

Die Länge Vergleich gibt es einige Kurzschluss Optimierung zu versuchen.

Ich gehe davon aus der Länge Vergleich ist schneller als die vollständige Zeichenfolge vergleichen, so dass, wenn 99% der Nichtübereinstimmungen zu beseitigen, wird es schneller sein, als die vollständige Zeichenfolge vergleicht jedes Mal zu tun.

Der Code wird die Länge Vergleich ausführen, es wird scheitern, dann wird es die vollständige Zeichenfolge vergleichen und überspringen Sie den Code ignorieren.

Die Länge der std :: string ist sehr wahrscheinlich ein Mitglied der std :: string-Objekts. Im Vergleich dazu könnte das erste Zeichen sehr gut auf dem Heap. Das bedeutet, dass die Stringlänge verbessert Referenz Örtlichkeit zu vergleichen. Natürlich mit der Optimierung Kurz String dies noch komplexer wird -. Lhs[0] auf dem Heap sein könnte, während Rhs[0] auf dem Stapel ist

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top