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
Antwort Antwort
Seite 1 von 2  1 2      
EgonHugeist

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

AW: Leerzeichen in String einfügen

  Alt 27. Jan 2016, 13:34
@Sir Rufo

fair und kannst was wegstecken!

Vorab, in !Mavarik!'s und deinen Versionen habe ich kleine compilierungs Änderungen gemacht.
Gibt es da Einwände ... sofort losbrüllen! Mein altes XE hat's nicht fressen wollen.

geht los habe den Shift auf 12 erhöht (siehe Test):

Zitat:
Benchmarking(x12 x2000000:
Autor: Mavarik Function: MavarikQuadUnderScoreInjector TickCount: 37719

Benchmarking(x12 x2000000:
Autor: EgonHugeist Function: leerzeichen TickCount: 15140

Benchmarking(x12 x2000000:
Autor: Sir Rufo Function: StrInsertEveryNthPos TickCount: 324188

Benchmarking(x12 x2000000:
Autor: EgonHugeist Function: EH_QuadUnderScoreInjectorBy4 TickCount: 15047

Benchmarking(x12 x2000000:
Autor: EgonHugeist Function: EH_QuadUnderScoreInjectorBy8 TickCount: 9437
Meine Funktionen würden unter 64Bit vielleicht noch besser laufen, da der UInt64 move da performanter ist als der 2x4Byte move, den die 32Bit IDE reinfummelt. Meine letzte Version läuft allen davon, desto länger der String wird. Da der TE aber nur von 128 Zeichen ausgeht tut es Version 1 und 2 genau sogut, wie Mavarik's version.

Eine Validierung fehlt, da dies die "reine" Geschwindigkeit verfälscht.

@Mav
die Funktionen mit den inserts hab ich gleich weggelassen. Darfst sie aber gerne hinzufügen, wenn die Autoren nix dagegen haben.
Angehängte Dateien
Dateityp: pas QuadUnderScoreInjections.pas (6,2 KB, 2x aufgerufen)

Geändert von EgonHugeist (27. Jan 2016 um 13:37 Uhr)
  Mit Zitat antworten Zitat
EgonHugeist

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

AW: Leerzeichen in String einfügen

  Alt 27. Jan 2016, 15:27
Hab mal das insert von Dejan Vu in gefixter Version hinzugefügt, Mavarik's Version gefixt und meine Änderung an Sir Rufo's version kontrolliert und überarbeitet..

Das insert() kommt, wie erwartet, im Vergleich nach gefühlten Jahren wieder..

Edit: Wird es überhaupt mit der Aufage fertig? Ich habs nach 30min abgebrochen.

Alle Funktionen liefern nun gültige Resultate.

Neue Verison ist angehängt.

Wer keine Zeit hat, kommentiert die insert Version aus.
Angehängte Dateien
Dateityp: pas QuadUnderScoreInjections.pas (6,7 KB, 3x aufgerufen)

Geändert von EgonHugeist (27. Jan 2016 um 16:11 Uhr)
  Mit Zitat antworten Zitat
EgonHugeist

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

AW: Leerzeichen in String einfügen

  Alt 27. Jan 2016, 17:32
Sitze grad beim Abendessen.



Sorry, da Fehler in meiner letzten Version, welche ich hochgeladen und deren Resultate gepostet habe..
habe den DupeString Shift auf 10 limitiert, um mal bei der Insert-Variante noch vor morgen früh ein Ergebnis zu bekommen:

Zitat:
Benchmarking DupeString('xyz', shl^0..10) Iterations: 2000000:
Autor: Mavarik Function: MavarikQuadUnderScoreInjector TickCount: 9735

Benchmarking DupeString('xyz', shl^0..10) Iterations: 2000000:
Autor: EgonHugeist Function: leerzeichen TickCount: 3500

Benchmarking DupeString('xyz', shl^0..10) Iterations: 2000000:
Autor: Sir Rufo Function: StrInsertEveryNthPos TickCount: 85719

Benchmarking DupeString('xyz', shl^0..10) Iterations: 2000000:
Autor: EgonHugeist Function: EH_QuadUnderScoreInjectorBy4 TickCount: 3469

Benchmarking DupeString('xyz', shl^0..10) Iterations: 2000000:
Autor: EgonHugeist Function: EH_QuadUnderScoreInjectorBy8 TickCount: 3437

Benchmarking DupeString('xyz', shl^0..10) Iterations: 2000000:
Autor: Dejan Vu Function: DejanVuQuadUnderScoreInjector TickCount: 579688
Angehängte Dateien
Dateityp: pas QuadUnderScoreInjections.pas (6,7 KB, 0x aufgerufen)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#4

AW: Leerzeichen in String einfügen

  Alt 27. Jan 2016, 18:19
Bahnbrechende Erkenntnis bei einem Codeschnippsel, das für einen Anfänger gedacht ist und dann in einem Buttonclick einmalig auf maximal 128 Zeichen losgelassen wird. Ich schlage vor, die beste Funktion mit der Parameterübergabeoption 'register' zu versehen, dann kann man nochmal einiges Rauskitzeln.

Eins ist sicher: Verwirrt ist der gute Mann (3 Beiträge, D7, Probleme in einer kleinen Schleife)bestimmt nicht.

Leute, im Ernst: Ist hier nicht ausnahmsweise angebracht (ja, ich weiß, es gibt Programmierer, die lehnen das ab), die einfachste Variante vorzuschlagen?

PS: Als Performancebooster war mein Vorschlag übrigens gar nicht gedacht, sondern als Versuch, die einfachste und verständlichste Version zu präsentieren. Falls das jemanden aufgefallen ist.
  Mit Zitat antworten Zitat
EgonHugeist

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

AW: Leerzeichen in String einfügen

  Alt 28. Jan 2016, 03:40
@Dejan Vu
Der TE ist in #5 bereits auf eine Lösung gekommen. Warum du dem TE in #7 wieder eine 2. Variante von #5 presentierst wird, erschließt sich mir nicht. Er hat gefragt, ihm ist das Insert() als eigene Lösung zuzugestehen. Völlig in Ordnung, er lernt es ja gerade.

Mavarik hat ihm in #6 wohlwollend zeigen wollen, wie man das schneller machen... Warum? Nun ich würde davon ausgehen, das der TE eines schönen Tages Automatisierungen vornehmen müßte, wenn nicht mit dem Beispiel, dann an anderer Stelle und in anderer Variante. Nun neigt man dazu bereits vorhandenen Code wieder zu nutzen, da es ja schon wunderbar mit TForm1.leerzeichen(text:string) funktioniert hat.
Ich bin nicht der Meinung, daß hier irgendwer den TE verwirren wollte, sondern auf sein konkretes Bsp. bezogen, mögliche Varianten der Herangehensweisen aufzeigen wollte.

Mavarik's Version (gefixt) und die von Sir Rufo zeigen ihm nur, daß man eben die String-Copy Orgien, ab 'ne Iteration > 2 wirklich vermeiden sollte. Das lernt er aus den Benchmarks: Numbers are talking!

Der TE kann sich diverse Erkenntnisse an allen Nachfolgenden Bsp. aneigenen. Wie: benutze Pointer-Inkrementierungen oder den Index des Strings, kalkuliere und reserviere den Speicher nur !einmal! und schieb rüber, was du braucht, schreibe kleine Funktionen und lagere diese aus ..... zum Bespiel.

Durch Mavarik's "schneller" in #6 ist mir bei der Aufgabe sofort aufgefallen, das man seiner Version noch so einiges abringen könnte ->#7
Ein wiederholtes "da geht noch was" und in Fragestellung, ob mein größeres Code-Konstrukt etwas bessere und messbare Ergebnisse liefert -> Benchmarks. Irrglaube wer denkt, wenig Code bringt in jedem Falle viel Geschwindigkeit!

Wenn der TE eines Tages sportliche/variable/hochgeschwindigkeits Resultate liefern sollte ... jeder hier wollte ihm auf seine Art und Weise zeigen, wie es geht. Uns hat man es ja auch mal gezeigt, oder nicht? Du hast ihm wiederholt, wie man es als Anfänger machen darf und man es bei mehr Erfahrung nicht machen sollte, warum auch immer. Er kann mit den zusätzlichen Code-Bsp. machen, was er möchte. Ist es zu kompliziert, sollte er weitere Erfahrungen sammeln und vielleicht später darauf zurückgreifen.

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.

@Mavarik
Ist der Test so in Ordnung für dich? Ergebnisse akzeptiert?

Geändert von EgonHugeist (28. Jan 2016 um 05:05 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#6

AW: Leerzeichen in String einfügen

  Alt 28. Jan 2016, 07:15
Die Lösung von #5 ist ja nicht korrekt, da sie die Länge des Strings ignoriert, daher die #7. Daraufhin hat Mavarik sein Pointerzeugs (nicht falsch verstehen, es ist 'good stuff') gepostet und dann hat sich der Thread in Richtung Performanceoptimierung degeneriert. So wird ein Schuh draus, gelle?

Ich fand es einfach amüsant, am Thema vorbei zu optimieren. Normalerweise macht man das dann in einem eigenen Thread, z.B. mit dem Titel 'Kata: Performanceoptimierung beim "Einfügen in Strings"'. Oder so ähnlich. Dann machen auch mehr Leute mit und es kann gefachsimpelt werden.

PS: Nicht falsch verstehen: Ich liebe Performanceoptimierungen.

Geändert von Dejan Vu (28. Jan 2016 um 07:21 Uhr)
  Mit Zitat antworten Zitat
EgonHugeist

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

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
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

AW: Leerzeichen in String einfügen

  Alt 30. Jan 2016, 06:11
Ich habe mir jetzt nicht alle Lösungen angeguckt. Vielleicht ist meine Idee schon dabei: Ausgangszeichenkette in Vierer-Blöcke aufsplitten und beim Zusammensetzen die Leerzeichen einfügen.

Vielleicht auch nicht am schnellsten, aber sehr anschaulich, was passiert, denke ich.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#9

AW: Leerzeichen in String einfügen

  Alt 28. Jan 2016, 08:13
Ich schlage vor, die beste Funktion mit der Parameterübergabeoption 'register' zu versehen, dann kann man nochmal einiges Rauskitzeln.
Ähhhhhhhhhhhhhhhh, Nö.

Das macht Delphi/Pascal standardmäßig von Haus aus.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#10

AW: Leerzeichen in String einfügen

  Alt 28. Jan 2016, 19:07
Ich schlage vor, die beste Funktion mit der Parameterübergabeoption 'register' zu versehen, dann kann man nochmal einiges Rauskitzeln.
Das macht Delphi/Pascal standardmäßig von Haus aus.
Echt? Ich hab doch irgendwo eine unverschämt gepimpte Version einer Stringfunktion gesehen, die das Result direkt in ein Register schreibt... Ich dachte, das würde so gehen.

Na ja. Ist eh wurscht.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 14:34 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