Frage

Ich bin mit extensiv Hashzuordnung Datenstrukturen in meinem Programm. Ich verwende eine Hash-Map Implementierung von Barry Kelly auf den CodeGear Foren gepostet. Dass die Umsetzung intern verwendet RTL CompareText Funktion. Profilieren machte mir klar, dass viel Zeit in SysUtils CompareText Funktion ausgegeben wird.

Ich hatte einen Blick auf die

Fastcode Website

und fand einige schnellere Implementierungen von CompareText. Leider scheinen sie nicht für D2009 und seine Unicode-Strings zu arbeiten.

Nun zur Frage: Gibt es eine ähnliche schnellere Version, die D2009 Strings unterstützt? Die CompareText Funktionen scheinen eine Menge aufgerufen werden, wenn Hash-Karten verwenden (zumindest in der Implemenation ich zur Zeit bin mit), so wenig Leistungsverbesserungen wirklich einen Unterschied machen könnten. Oder sollten die dort präsentierten Implementierungen auch für Unicode-Strings arbeiten?

War es hilfreich?

Lösung

Viele der FastCode Funktionen werden wahrscheinlich kompilieren und scheinen ganz gut in Delphi 2009 zu arbeiten, aber sie werden für alle Eingaben nicht richtig sein. Diejenigen, die in Assembler implementiert sind, werden scheitern, weil sie Zeichen annehmen, sind nur jeweils ein Byte. Die, die in Delphi implementiert werden ein wenig besser gehen, aber sie werden immer noch falsche Ergebnisse manchmal zurück, weil die alten CompareText Begriff der „Groß- und Kleinschreibung“ auf ASCII basiert, während die neuen auf Unicode basieren sollte. Die Regeln für die Zeichen gelten die gleichen für Fall speichern sind viel andere für Unicode aus, wie sie sind für ASCII.

sagt Andreas in einem Kommentar unter diesem Unicode CompareText noch die ASCII-Fall-Vergleichsregeln verwendet, so dass eine Anzahl der FastCode Funktionen sollte gut funktionieren. schauen sie einfach vorbei, bevor sie mit, um sicherzustellen, dass sie keine Zeichengröße Annahmen. Ich glaube mich zu erinnern, dass einige FastCode Funktionen bereits in der Delphi-RTL aufgenommen wurden. Ich habe keine Ahnung, ob CompareText einer von ihnen war.

Wenn Sie anrufen eine Menge in einer Hash-Tabelle CompareText, dann schlägt vor, dass Ihre Hash-Tabelle nicht eine sehr gute Arbeit leistet. CompareText sollte nur aufgerufen werden, wenn der Hash-Wert des, was Sie sich für bezeichnet einen nicht-leeren Eimer in der Hash-Tabelle zu suchen. Von dort wird oft eine Hash-Tabelle eine lineare Suche verwenden, um die richtigen Artikel in dem Eimer zu finden, und es wird während dieser Suche CompareText für jedes Element nennen. Ich weiß nicht, ob das ist, wie diejenige, die Sie Werke verwenden.

Sie können dieses Problem lösen, indem eine andere Hash-Funktion, die die Ergebnisse gleichmäßiger über die zur Verfügung stehenden Eimer verteilt. Wenn Ihre Eimer bereits gleichmäßig gefüllt, dann können Sie mehr Eimer benötigen (und dann stellen Sie sicher noch die Hash-Funktion verteilt gleichmäßig über , die Anzahl als auch).

Wenn die Hash-Karte Klasse Sie verwenden auf TBucketList basiert, dann gibt es Raum für Verbesserungen in den Eimer Lagerung. Diese Klasse nicht berechnet einen Hash auf dem gesamten Eingang. Es verwendet den Eingang nur die Schaufel zu bestimmen, zu verwenden. Wenn die Klasse auch den Überblick über die volle Hash halten würde für eine Zeichenfolge berechnet, dann Vergleiche während der linearen Suche könnten viel schneller gehen. Man vergleiche nur die Hashes, und nur die Saiten vergleichen, wenn die Hashes vollständig übereinstimmen. (Für eine 256-Eimer Eimer-Liste, die größten unterstützte Größe, nur ein Byte des Eingangs bestimmt den Eimer, und den Rest des Bytes werden ignoriert.) ich habe hier vor über TBucketList geschrieben.

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