AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Stringkonkatenation ist schneller als direktes Kopieren?
Thema durchsuchen
Ansicht
Themen-Optionen

Stringkonkatenation ist schneller als direktes Kopieren?

Ein Thema von alzaimar · begonnen am 19. Mär 2008 · letzter Beitrag vom 19. Mär 2008
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#11

Re: Stringkonkatenation ist schneller als direktes Kopieren?

  Alt 19. Mär 2008, 20:32
Zitat von alzaimar:
Noch lustiger: Ich ersetze also TStringList mit einem dynamischen Stringarray... Lasst Euch überraschen
Womit meine Ergebnisse aus dem anderen Thread ja bestätigt wären

Freut mich, dass meine Frage zu einer so regen Diskussion geführt hat Ich hoffe es kommt auch noch was schnelles dabei raus

  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#12

Re: Stringkonkatenation ist schneller als direktes Kopieren?

  Alt 19. Mär 2008, 20:37
Zitat von Meflin:
Ich hoffe es kommt auch noch was schnelles dabei raus
Klar geht es noch schneller. Nur wird es dann ziemlich lowlevelig und spezialisierter.

Delphi-Quellcode:
type
  THackedStringList = class(TStrings) // funktioniert nur noch mit echten TStringList Klassen
  public
    FList: PStringItemList;
  end;

function V2(s: TStringList): Integer;
var
  l, i, j, n: Integer;
  z: PChar;
  x: String;
  Arr: array of record
    Data: PChar;
    Len: Integer;
  end;
begin
  n := 0;
  SetLength(Arr, s.Count);
  for i := 0 To s.Count - 1 Do
  begin
    Arr[i].Data := Pointer(THackedStringList(s).FList[i].FString); // kein CPU LOCK mehr
    Arr[i].Len := Length(PString(@Arr[i].Data)^);
    Inc(n, Arr[i].Len);
  end;

  SetLength(x, n);
  j := 0; // PChar startet bei 0
  for i := 0 To High(Arr) do
  begin
    z := Arr[i].Data;
    l := Arr[i].Len;
    Move(z^, PChar(PChar(Pointer(x)) + j)^, l * SizeOf(Char)); // kein UniqueString aufrufen
    Inc(j, l);
  end;

  Result := Length(x);
end;
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#13

Re: Stringkonkatenation ist schneller als direktes Kopieren?

  Alt 19. Mär 2008, 20:39
@jbg: Wir argumentieren doch immer so, das bei einer Stringkonkatenation (hier) 1 Mio mal neuer Speicher angefordert und der String umkopiert werden muss, und das dauert und daher sollte man V2 nehmen. Wir alle predigen das, und das basiert ja i.A. auf eigenen Erfahrungen.

Wenn man das dann mal manifestieren will (sozusagen als Demo fur Dummies), fällt man so richtig (aber so richtig!) auf die Plautze.

Ehrlich gesagt bin ich etwas verwirrt.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#14

Re: Stringkonkatenation ist schneller als direktes Kopieren?

  Alt 19. Mär 2008, 20:46
Zitat von alzaimar:
@jbg: Wir argumentieren doch immer so, das bei einer Stringkonkatenation (hier) 1 Mio mal neuer Speicher angefordert und der String umkopiert werden muss, und das dauert und daher sollte man V2 nehmen.
Das ist auch so richtig. Nur gehen wir dabei nicht mehr mit der Zeit. Wenn FastMM4 im Spiel ist, werden String-Konkatenationen schon mal von Haus aus schneller, weil nicht mehr für jedes zusätzliche Zeichen neuer Speicher angefordert wird, sondern immer in größeren Blöcken. Das wird dann zwar mit mehr Speicherverbrauch bezahlt, aber bei den heutigen RAM Größen ist das vernachlässigbar.
Zum anderen kommen bei heutigen Systemen mehrere CPUs ins Spiel. Dort sind die CPU LOCKs (derer gleich drei Stück in LStrAsg enthalten sind) teurer, weil ja tatsächlich eine andere CPU auf den Speicher zugreifen könnte. Davon sind Hyperthreading Prozessoren ebenfalls betroffen.

Zitat:
Wenn man das dann mal manifestieren will (sozusagen als Demo fur Dummies), fällt man so richtig (aber so richtig!) auf die Plautze.
Compilermagic kann eben grausam sein.

Zitat:
Ehrlich gesagt bin ich etwas verwirrt.
Das bin ich zwar nicht, aber um das ganze Schneller zu machen, muss nun der ohnehin schon kompliziertere Code nochmals verkompliziert werden. Am Schluss blickt man dann gar nicht mehr durch, weil es nur noch so von "Compiler lass die verdammte Compilermagic hier weg" Anweisungen so wimmelt.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#15

Re: Stringkonkatenation ist schneller als direktes Kopieren?

  Alt 19. Mär 2008, 21:24
Bei mir ist selbst bei FastMM4 die Konkatenation schneller.

Ich schließe daraus, das wir uns nicht mehr so sehr um Performance scheren müssen, sondern eher die Verfahren optimieren können. Delphi und moderne MMS kompilieren das schon recht ordendlich. Ich persönlich finde das beruhigend, weil ich -ehrlich gesagt- nicht ständig mit irgendwelchen Tricks rumhantieren muss, sondern mich auf Algorithmen und Verfahren konzentrieren kann.

Danke für die Analysen.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 06:40 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