Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi string zum array of char (https://www.delphipraxis.net/28022-string-zum-array-char.html)

Snoop007 18. Aug 2004 20:56

Re: string zum array of char
 
danke euch ! das war echt eine gute idee mit dem casten !!

ich habe die zeit gemessen, einmal kopierte das programm die zeichen, das andere mal hab ich die zeichen mit dem casten rübergebracht

beide ergebnisse sind gleich, 0 Milisekunden; dann machts keinen unterschied, wie ich die zeichen hin und herbewege

vielen dank !

dizzy 18. Aug 2004 23:48

Re: string zum array of char
 
Du hast doch bestimmt nur ein einmaliges Ausführen gemessen, gell? Mach das mal in einer Schleife, so ~10.000.000 mal. Dann wirst du einen kräftigen Unterschied bemerken!

Hab mal grad ausprobiert:
Delphi-Quellcode:
type
  TCharArray = array[0..255] of Char;
  PCharArray = ^TCharArray;
.
.
.
const
  st: string = 'AF724H8u+_99Hqifbq251';
.
.
.
procedure TForm1.Button1Click(Sender: TObject);
var A: TCharArray;
    S: string;
    i: Integer;
    t: Int64;
begin
  S := st;
  t := GetTickCount;
  for i := 1 to 10000000 do
    A := PCharArray(S)^;
  t := GetTickCount - t;
  Form1.Caption := string(A)+' in '+IntToStr(t)+'ms';
end;

procedure TForm1.Button2Click(Sender: TObject);
var A: TCharArray;
    S: string;
    i,m: Integer;
    t: Int64;
begin
  S := st;
  t := GetTickCount;
  for i := 1 to 10000000 do
    for m := 0 to Length(S) do
      A[m] := S[m+1];
  t := GetTickCount - t;
  Form1.Caption := string(A)+' in '+IntToStr(t)+'ms';
end;
Also im ersten Fall mit Cast, im 2. mit Kopierschleife. Und jetzt kommt der Knaller: Bei 21 Zeichen (wie hier im Bsp.) sind beide Verfahren tatsächlich faktisch gleich schnell. Mit weniger Zeichen ist die Kopierschleife erheblich schneller :shock:!!
Macht ein Cast so einen Aufwand? Ist doch im Grunde keine Arbeit hinter, oder? Ich hätte bis gerade noch meinen Ar*** darauf verwettet, dass der Cast immer schneller ist :roteyes:.


gruss, ein verdutzter
dizzy

Nothine 19. Aug 2004 00:03

Re: string zum array of char
 
andererseits ist der cast bei bspw. 56 zeichen (damit hab ichs getestet) mehr als doppelt so schnell :!: kommt also ganz drauf an wofür man das einsetzen will...

Snoop007 19. Aug 2004 00:35

Re: string zum array of char
 
ich hab es mehrfach ausgeführt, allerdings nicht in einer schleife ist , wie ich finde auch nicht nötig ( in meinem fall ) -> unrealistisch

du lässt
Delphi-Quellcode:
..for m := 0 to Length(S) do..
jedesmal die länge neu berechnen, ( oder ist es optimiert und wird nur einmal berechent ? glaub ich net )
das verbraucht zu viel zeit, da immer 255 zeichen kopiert werden sollen, könnte es ein konstanter wert sein ( ja ja jetzt geht die kleinkarriertheit los :drunken: )
beim casten werden auch alle zeichen werden kopiert

nailor 19. Aug 2004 01:39

Re: string zum array of char
 
man kann das ganze auch noch schneller machen

Delphi-Quellcode:
asm
// [...]
end;
hab jetzt bisschen was ausgelassen, aber das prinzip sollte klar sein ;). an sonsten bleibt zu sagen, dass es, falls es sich nicht um einen der berüchtigten flaschenhälse handelt, es ziemlich egal sein dürfte, welche variante man wählt. man kann die typecast-version noch ein wenig tunen, aber die schleife kann man imho besser lesen.

dizzy 19. Aug 2004 02:31

Re: string zum array of char
 
Zitat:

Zitat von Snoop007
du lässt [...] jedesmal die länge neu berechnen, ( oder ist es optimiert und wird nur einmal berechent ? glaub ich net )

Ich glaube auch nicht, dass das nur ein Mal gemacht wird... stimmt, das ist noch Potential drin :)

Zitat:

Zitat von Snoop007
[...] immer 255 zeichen kopiert werden sollen

Zwar ist dieses Zitat aus dem Zusammenhang gerissen, aber das hat mir jetzt die Idee gegeben, warum der Cast z.T. langsamer ist: Beim Cast wird alles kopiert, in der Schleife nur "Length" viele Chars.
Also ist es - so man das an einer zeitkritischen Stelle verwenden will - abhängig von den vorliegenden Datentypen, und deren Längen und tatsächlich gefüllten Längen welche Variante man nun benutzt.
Den Cast finde ich imho aber übersichtlicher, da es ja nur eine Zeile ist. Die Schleife sieht irgendwie "zerupft" aus :stupid:.

ripper8472 19. Aug 2004 02:38

Re: string zum array of char
 
das müsste ja auch mit memcopy (oder wie des hier heißt) gehen. einfach den ansistring zum pointer casten, mit Addr() die Adresse des ersten zeichens vom char array ermitteln und dann kopieren. ich denk mal, es ist langsamer als ein cast, aber mindestens schneller als durch den string iterieren und die chars einzeln zuweisen.

[edit] der cast ist ja nicht das langsame, sondern dass diese gecastete variable dann kopiert wird... also söllte memcopy doch schneller als das sein

dizzy 19. Aug 2004 02:48

Re: string zum array of char
 
Dürfte einem Cast sehr ähnlich sein, da ja auch alles kopiert wird. Ermittelt man aber vorher die tatsächlich benötigte Länge, könnte das u.U. performanter sein, jupp.

Nothine 19. Aug 2004 03:06

Re: string zum array of char
 
hab mal ein bissl rumprobiert, die entsprechung der memcopy funktion ist die funktion move, und denn entsprechenden code will ich euch natürlich auch nicht vorenthalten :roll:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var S: string;
    A: array of Char;
begin
  S := 'blablabla';
  SetLength(A,Length(S));
  Move(PChar(S)^,A[0],Length(S));
  Form1.Caption := string(A);
end;
Edit: ich hab grad auch mal den zeittest gemacht, und eigentlich schneidet diese variante recht gut ab (im bsp. um 800 ms)
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var S: string;
    A: array of Char;
    I: Integer;
    T: Int64;
begin
  S := 'blablablablablablablablablablablablablablablablablablabla';
  SetLength(A,Length(S));
  T := GetTickCount;
  for I := 1 to 10000000 do
    Move(PChar(S)^,A[0],Length(S));
  Form1.Caption := string(A)+' in '+IntToStr(GetTickCount-T)+' ms';
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:08 Uhr.
Seite 2 von 2     12   

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