Vergleichen von arrays in Delphi
Ich habe 3 arrays, zum Beispiel:
const
A: Array[0..9] of Byte = ($00, $01, $AA, $A1, $BB, $B1, $B2, $B3, $B4, $FF);
B: Array[0..2] of Byte = ($A1, $BB, $B1);
C: Array[0..2] of Byte = ($00, $BB, $FF);
Gibt es eine Möglichkeit zu vergleichen und erhalten Sie den index des richtigen, anstelle der überprüfung jedes byte 1 von 1? Zum Beispiel:
function GetArrayIndex(Source, Value: Array of Byte): Integer;
begin
..
end;
GetArrayIndex(A, B); // results 3
GetArrayIndex(A, C); // results -1
Vielen Dank im Voraus.
- Hier ist die Antwort, gibt es irgendwelche "Pos" - Funktion zu finden bytes?.
- Tolle und schnelle Antwort. (ich habe über 1h und die Hälfte, um nichts zu finden ist, während u hat es in ..5'?). Danke!!! Ich habe zu studieren, etwas mehr über Zeiger und solche, um die Nutzung dieser Funktionen.
- Ich werde eine überarbeitete version von Andreas Antwort für Sie, um zu studieren.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Pos
führen Sie eine überprüfen Sie jedes byte 1 von 1?Hier ist eine überarbeitete version von Andreas Antwort hier.
Bummis Antwort ist zu bevorzugen, wenn. Viel besser.
Nur eine Bemerkung wie bereits in den Kommentaren.
Für kleine Datensätze
BytePos
übertrifftByteArrayPos
, während für große Datensätze (10.000 Stück) der Leistung ist es Umgekehrt.Dies ist für die 32-bit-Modus, wo der assembler optimiert
Pos()
system-Funktion funktioniert am besten für große datasets.Im 64-bit Modus gibt es aber keinen assembler optimiert, Pos () - Funktion.
In meinem Vergleichstest
BytePos
ist 4-6 mal schneller alsByteArrayPos
für alle Arten von dataset-Größen.Update
Den benchmark-test wurde mit XE3.
Einer Verbesserung Anforderung wurde Hinzugefügt, QC111103, wo die vorgeschlagene Funktion ist etwa 3 mal schneller.
Ich auch optimiert, der oben
BytePos
ein bisschen und präsentieren Sie hier unten alsByteposEx()
.BytePos
ist ein wenig mehr als 3 mal schneller in dem kleinen Datensatz, während für die großen Datensatz das Ergebnis ist das Gegenteil. Schlussfolgerung: Die Zuordnung der beiden Zeichenfolgen inByteArrayPos
geben eine Leistungseinbuße für kleine Datensätze, während die optimiertePos
system-Funktion zeichnet sich für große Datensätze.Pos()
Funktion. Und die performance ist viel schlechter alsBytePos
. Ein Faktor von 4-6 für kleine und große Datenmengen.Pattern[0] = Pattern[1]
sollten Sie überspringen den rest des Puffers gesucht, der inneren Schleife. Ich erinnere mich nicht, wer waren die Personen, die 1. geprägt ist dieser Algorithmus, noch sollten Sie haben eine variabledistance
als offset zum nächsten auftreten des 1. byte in das Muster, so, dass Sie möchten, überspringen Sie einfach die grundlose Suche nach Pattern[0] für die nächsten J Zeichen 🙂SetString
kopieren von Inhalten wieUniqueString
tut ? außer, dass ich nicht sehen kann, warum Ihr code kann schneller sein als die bummi ist einI+J
änderung alle Briefe würde einmal gescannt werden. Mitdistance
var Buchstaben "E" und "F" wäre übersprungen und nie in Betracht gezogen. Okay, in diesem Beispiel würde es wahrscheinlich keinen Unterschied machen - der Puffer würde trotzdem vollständig gezogen in CPU-cache, aber auf einige mehr sparse-Muster, es könnte einen Unterschied machen.