Einzelnen Beitrag anzeigen

EgonHugeist

Registriert seit: 17. Sep 2011
187 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#29

AW: Leerzeichen in String einfügen

  Alt 30. Jan 2016, 04:33
Guten Morgen,

wollte Dejan Vu's produktiven Worten eigentlich den Vortritt beim Abschluß dieses Threads lassen. Doch:

@Dejan Vu
Ich habe hierbei auch etwas gelernt:
Code:
    if (Pointer(Result) = nil) or //result unassigned?
       (PLongInt(NativeUInt(Result) - SizeOf(LongInt))^ <> SrcLen) {PStrRec.Len} or //length different?
       (PLongInt(NativeUInt(Result) - (SizeOf(LongInt) shl 1))^ <> 1) {PStrRec.RefCnt} then //no unique string?
      SetLength(Result,SrcLen+((SrcLen-1) shr 2));
Für hoch performante String functions war ich es gewohnt erst den String-Refcount und die Länge zu testen, bevor ich ein SetLength() calle. Die älteren IDE's haben in jedem Falle einen neuen Unique-String erzeugt. Nun scheint mir das dieser Test schon implizit dem SetLength drin ist. Oder baut das der Compiler neuerdings direkt ein? Das war nicht immer so, und gilt herauszufinden, seit welcher Version sich Delphi so verhält. Klar ich spare den Call aber der Code wird unleserlich und für jemanden, der davon keine Ahnung hat, völlig banane.
Nu kuck ... muß meine gewohnte low-Level Syntax nun doch nicht in Frage stellen. Mir fällt's gerade wie Schuppen von den Augen:
Ich vergleiche hier die Result-Länge mit der Source-Länge. Na sooo wird dad doch auch nix!

Also ... habe ich die Unit nochmals angehängt. Es kitzelt doch noch einige Ticks raus:

Zitat von Benchmarks:
Task: Fuege einen "_" -Char an jeder 4. Stelle ein!
Benchmarking DupeString('xyz', 1 shl^0..10) Iterations: 2000000:

Autor: "Mavarik" Function: "MavarikQuadUnderScoreInjector" TickCount: 9688
Autor: "Dejan Vu" Function: "DejanVuQuadUnderScoreInjector" TickCount: 575078
Autor: "EgonHugeist" Function: "leerzeichen" TickCount: 3500
Autor: "Sir Rufo" Function: "StrInsertEveryNthPos" TickCount: 85328
Autor: "EgonHugeist" Function: "EH_QuadUnderScoreInjectorBy4" TickCount: 3313
Autor: "EgonHugeist" Function: "EH_QuadUnderScoreInjectorBy8" TickCount: 3250

Task: Fuege einen "/\"-String an jeder 4. Stelle ein!
Benchmarking DupeString('xyz', 1 shl^0..10) Iterations: 2000000:

Autor: "Sir Rufo" Function: "StrInsertEveryNthPos" TickCount: 139406
Autor: "EgonHugeist" Function: "EH_StrInsertEveryNthPos" TickCount: 25422
From my POV ... case closed.

PS. @Mavarik das div 4 braucht ca. 10 Zyklen, wärend ein shr 2 einen braucht.. Ist der Hauptunterschied zwischen "Leerzeichen" und "EH_QuadUnderScoreInjectorBy4"..
Angehängte Dateien
Dateityp: pas QuadUnderScoreInjections.pas (10,8 KB, 4x aufgerufen)

Geändert von EgonHugeist (30. Jan 2016 um 05:23 Uhr) Grund: typo
  Mit Zitat antworten Zitat