AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Leerzeichen in String einfügen

Ein Thema von majornudelholz · begonnen am 26. Jan 2016 · letzter Beitrag vom 2. Feb 2016
Antwort Antwort
Seite 2 von 5     12 34     Letzte » 
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.123 Beiträge
 
Delphi 10.3 Rio
 
#11

AW: Leerzeichen in String einfügen

  Alt 27. Jan 2016, 10:57
@Sir Rufo sehr nice und wie immer natürlich variable und "zu gebrauchen"
@EgonHugeist der Quadmove ist natürlich sehr nett, aber da durch brauchst Du drumrum natürlich mehr...
Wäre zu testen ob der Quadmove das wett macht...

Alle Routinen mit Insert - gehen natürlich gar nicht - weil der String nicht nur 192 Zeichen, sondern auch mal 20MB lang seinen kann...

Die Frage ist, wenn der String Steuerzeichen hat - wie #13#10 oder #10#13 oder nur #10 oder #13... Beginnt der Zähler dann bei 0? Und natürlich darf das " " oder "_" nicht zwischen #13_#10 eingefügt werden...

Kommt Leute da geht noch was...

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

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

AW: Leerzeichen in String einfügen

  Alt 27. Jan 2016, 11:48
@mav

meine Portierung hält sich exakt an das, was der TE wollte. Ich halte es für abwägig, das LineEndings oder andere ctrl chars im TEdit landen...

Klar geht noch was:

Code:
function EH_QuadUnderScoreFillerBy4(Const Text: String): String;
type PMyQuadMover = {$IFDEF UNICODE}PUInt64{$ELSE}PLongWord{$ENDIF};
var
  Src, Dest, PEnd: PChar;
  SrcLen: Integer;
begin
  if Text = '' then
    Result :=''
  else begin
    SrcLen := PLongInt(NativeUInt(Text) - SizeOf(LongInt))^; //fast get src length
    Src := Pointer(Text);
    PEnd := Src+SrcLen-5;
    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));
    Dest := Pointer(Result);
    while (Src <= PEnd) do begin//making a quad processing loop
      PMyQuadMover(Dest)^ := PMyQuadMover(Src)^;
      (Dest+4)^ := '_';
      Inc(Dest, 5);
      Inc(Src, 4);
    end;
    Inc(PEnd, 4);
    while Src < PEnd do //processing final chars
    begin
      Dest^ := Src^;
      Inc(Src);
      Inc(Dest);
    end;
    Dest^ := Src^; //null term save
  end;
end;
und nu 2 quad moves in einer loop (macht nur sinn, wenn der String länger ist)
Code:
function EH_QuadUnderScoreFillerBy8(Const Text: String): String;
type PMyQuadMover = {$IFDEF UNICODE}PUInt64{$ELSE}PLongWord{$ENDIF};
var
  Src, Dest, PEnd: PChar;
  SrcLen: Integer;
begin
  if Text = '' then
    Result :=''
  else begin
    SrcLen := PLongInt(NativeUInt(Text) - SizeOf(LongInt))^; //fast get src length
    Src := Pointer(Text);
    PEnd := Src+SrcLen-9;
    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));
    Dest := Pointer(Result);
    while (Src <= PEnd) do begin//making a octed processing loop
      PMyQuadMover(Dest)^ := PMyQuadMover(Src)^;
      (Dest+4)^ := '_';
      PMyQuadMover(Dest+5)^ := PMyQuadMover(Src+4)^;
      (Dest+9)^ := '_';
      Inc(Dest, 10);
      Inc(Src, 8);
    end;
    Inc(PEnd, 8);
    if ((Src+4) <= PEnd) then begin//making final quad move
      PMyQuadMover(Dest)^ := PMyQuadMover(Src)^;
      (Dest+4)^ := '_';
      Inc(Dest, 5);
      Inc(Src, 4);
    end;
    while Src < PEnd do //processing final chars
    begin
      Dest^ := Src^;
      Inc(Src);
      Inc(Dest);
    end;
    Dest^ := Src^; //null term save
  end;
end;
Jup mehr drum herum, ist nicht abzustreiten. Jags mal durch nen Tick-Counter mit 'ner loop x 5.000.000 ich garantier dir der Unterschied ist riesig.

Das gilt im PurePascal erst mal zu Schlagen! Wer traut sich?

Gruß vom ZeosDevTeam

Edit: a shr vs shl war verdreht, sorry sonst funzt das "Reuse-Result" nicht

Geändert von EgonHugeist (27. Jan 2016 um 12:37 Uhr) Grund: typo
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#13

AW: Leerzeichen in String einfügen

  Alt 27. Jan 2016, 11:49
Die Frage ist, wenn der String Steuerzeichen hat - wie #13#10 oder #10#13 oder nur #10 oder #13... Beginnt der Zähler dann bei 0? Und natürlich darf das " " oder "_" nicht zwischen #13_#10 eingefügt werden...
Dann kommt wieder Composite ins Spiel.
  • String in Zeilen splitten
  • Jede Zeile durch die Routine
  • Zeilen wieder zusammenfassen
Eine zu starke Spezialisierung macht keinen Sinn, denn mal ist ein Zeilenumbruch #10 mal #13 mal #13#10 ... und dann werden die Zeilen an weiß der Geier woran umgebrochen (HTML bei einem <br>)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Leerzeichen in String einfügen

  Alt 27. Jan 2016, 13:29
Dann kommt wieder Composite ins Spiel.
Wie Recht du doch hast.

A: Surrogates und bei ANSI die MultiByte-Zeichensätze > https://de.wikipedia.org/wiki/UTF-16
B: Ä kann auch als A mit ¨ geschrieben werden > https://en.wikipedia.org/wiki/Precomposed_character https://en.wikipedia.org/wiki/Composite_character https://de.wikipedia.org/wiki/%C3%84 https://de.wikipedia.org/wiki/Trema https://de.wikipedia.org/wiki/Unicod...tische_Zeichen ...

MSDN-Library durchsuchenCharNext / MSDN-Library durchsuchenCharNextEx
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

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

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

AW: Leerzeichen in String einfügen

  Alt 27. Jan 2016, 13:42
Zum Spaß, hab ich mal ne kleine Benchmark Sache gemacht..

Zitat:
Benchmarking(x16 x 2.000.000):
Autor: Maverik Function: MaverikQuadUnderScoreInjector between 9734

Benchmarking(x16 x 2.000.000):
Autor: EgonHugeist Function: leerzeichen between 3500

Benchmarking(x16 x 2.000.000):
Autor: EgonHugeist Function: EH_QuadUnderScoreInjectorBy4 between 3453

Benchmarking(x16 x 2.000.000):
Autor: EgonHugeist Function: EH_QuadUnderScoreInjectorBy8 between 3437
Habe mal laaaange strings unterdrückt, da MaverikQuadUnderScoreInjector etwas laaange braucht.
@Sir Rufo
Darf ich deine Resultate zum Spaß beihängen? Habe ne kleine Test-Unit gebastelt. Mit deiner StrInsertEveryNthPos function..

Sonst würd ich die wieder rausnehmen und nur für Maverik der Validierung halber anhängen..
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#16

AW: Leerzeichen in String einfügen

  Alt 27. Jan 2016, 13:56
Wieso denn nicht?

Keine Hemmungen ... das halte ich schon aus
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.123 Beiträge
 
Delphi 10.3 Rio
 
#17

AW: Leerzeichen in String einfügen

  Alt 27. Jan 2016, 14:13
Zum Spaß, hab ich mal ne kleine Benchmark Sache gemacht..
3 Sachen...

1. Zeig mal Deine Testroutine.
2. Vergleiche mal die Version mit der Insert variante.
3. Schreibe bitte meinen Nickname richtig... Danke
  Mit Zitat antworten Zitat
EgonHugeist

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

AW: Leerzeichen in String einfügen

  Alt 27. Jan 2016, 14: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 14:37 Uhr)
  Mit Zitat antworten Zitat
EgonHugeist

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

AW: Leerzeichen in String einfügen

  Alt 27. Jan 2016, 16: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 17:11 Uhr)
  Mit Zitat antworten Zitat
EgonHugeist

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

AW: Leerzeichen in String einfügen

  Alt 27. Jan 2016, 18: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
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 19:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz