AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Leerzeichen in String einfügen

Ein Thema von majornudelholz · begonnen am 26. Jan 2016 · letzter Beitrag vom 2. Feb 2016
 
EgonHugeist

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

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
 

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz