TStream.Position im Vergleich zu TStream.Suchen
Verschieben die "aktuelle byte-Zeiger in TStream-Klasse können wir über die Eigenschaft Position (z.B. MyStream.Position := 0) oder über die Seek-Methode (z.B. MyStream.Seek(0, soFromBeginning). Die Frage ist, was effizienter ist (aka schneller)? (Ich habe nicht die Quelle, so konnte ich nicht prüfen, es selbst).
Bisher verwende ich immer Suchen, die Positionierung, die sagte Zeiger.
- und kyndigs: es gibt einen Beitrag von Synapse-change-log-Seite (synapse.ararat.cz/doc/ChangeLog.html), hat mich fasziniert, es sagt: "Mit TStream.Position anstelle von TStream.Suchen. Bessere Kompatibilität mit großen strömen." (unter ftpsend ändern)
- Faszinierend ja. Könnte auch etwas zu tun mit der Position, immer mit der 64-bit-version von Seek first wie bereits erwähnt in @Uwe ' s Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als
TStream.Seek
ist eine überladene Funktion, Handhabung von 32-Bit-oder 64-Bit-Werte, es kommt auf die aktuelle stream-Implementierung, die möglicherweise die bessere Wahl.Beispielsweise
TCustomMemoryStream
implementiert die 32-Bit-version vonSeek()
. Wenn SiePosition
auf dem stream dieser wird zunächst rufen Sie die 64-Bit-version, die wirft die Wert auf einen Longint beim Aufruf die 32-Bit-version. (Dies wird wahrscheinlich mit einem 64-Bit-version von Delphi!)Auf der anderen Seite eine
THandleStream
implementiert die 64-Bit-version vonSeek()
. Wenn Sie anrufenSeek()
mit einem 32-Bit-Wert, den Sie am Ende in einem ziemlich fiesen Mechanismus, der den Aufruf der 64-Bit-version.Mein persönlicher Rat wäre, um
Position
. Zumindest ist es die bessere Wahl in der Zukunft.Abgesehen von den Funktionsaufruf-overhead, um die Position-Eigenschaft setter, es gibt keinen Unterschied, wie die Position-Eigenschaft fordert, Suchen Sie mit dem angegebenen Wert und am Anfang beginnen.:
Die seek-Fehler wurde vor langer Zeit von mir und hier ist die Erklärung:
Suchen hat zwei verschiedene Parameter, die sind beide akzeptiert:
soFromBeginning
soBeginning
Einer von diesen führen auch zu 32-bit-code-Pfad-Ausführung, auch wenn ein 64-bit-integer wurde als parameter übergeben.
Einem der anderen anrufen wird die 64-bit-code-Pfad mit einem 64-bit-parameter.
Somit den Aufruf der falschen Funktion kann dazu führen, 4GB-Grenze/wrap zurück Fehler.
Wenn ich mich richtig erinnere und es ist irgendwie offensichtlich zu, was was ist:
soFromBeginning ist der alte Weg, der dazu führen kann die 4-GB-Grenze Fehler.
soBeginning führt zu einer richtigen sucht für 64-bit-integer-Parameter.
Den compiler-Hersteller hat nie erklärt, warum es gibt zwei Typen für suchen. Konnte Sie nicht gelöst haben, es mehr aus ?
Vielleicht die Lösung mit nur einer Art könnte brechen code ?
Brechen code ist sicherer als verlassen der situation, wie Sie derzeit ist, da wird es zweifelsohne heute führen zu 4GB-Grenze/wrap zurück Fehler.
Anstatt zu versuchen, es zu beheben, Sie haben es veraltet ?! Verdammt seltsam.
Abwertend hat es wenigstens einen nutzen. Es wird Delphi Programmierer mißtrauisch verbuggt Methode und vielleicht google es und kommen über diesen Beitrag und dann könnten Sie erkennen, dass Sie ein potential haben, 4GB-Grenze Fehler in Ihrem code. Dies war nicht einfach, Fehler zu finden. Ich schrieb ein spezielles TDebugStream, um es zu finden. So wird es sparen Sie einige debugging-Aufwand.
Vielleicht sollte der compiler erweitert werden, mit einer neuen Art der Warnmeldung: "potential für Fehler" oder so 😉 oder "potenziell verbuggt-Methode" alert-Programmierer gefährlicher bug Situationen 😉
Ich glaube nicht, dass es irgendeine große Leistung zwischen Ihnen.
Diese kann auf unterschiedlichen Parametern, so können Sie suchen von Anfang, die aktuelle position oder das Ende des Stroms.
Dieser ruft ab oder legt die absolute position des stream.
Nur ein Hinweis für die Leser: Suchen ist veraltet in Delphi/Rad Studio XE4, so sollten Sie die Verwendung von TStream.Position, anstatt zu Suchen.
deprecated
- gut erzogen-code nicht nennen, aber er "das richtige tut", wenn es nicht genannt.Wie ich schon in einem der Kommentare, gibt es 3 von überladenen Methoden Suchen. Einer von Ihnen ist veraltet, das man das zweite argument "Herkunft" ist ein Wort, das anstelle eines TSeekOrigin.
TSeekOrigin = (soBeginning, soCurrent, soEnd);
So, wenn jeder mit TSeekOrigin sollte dieses problem gelöst werden.
Besser wäre natürlich nur um die position, wie die akzeptierte Lösung...
Beide gleich sind. Sollten Sie die option verwenden, dass ist besser lesbar.