![]() |
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 ! |
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:
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:!!
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; 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 |
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...
|
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:
jedesmal die länge neu berechnen, ( oder ist es optimiert und wird nur einmal berechent ? glaub ich net )
..for m := 0 to Length(S) do..
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 |
Re: string zum array of char
man kann das ganze auch noch schneller machen
Delphi-Quellcode:
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.
asm
// [...] end; |
Re: string zum array of char
Zitat:
Zitat:
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:. |
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 |
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.
|
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:
Edit: ich hab grad auch mal den zeittest gemacht, und eigentlich schneidet diese variante recht gut ab (im bsp. um 800 ms)
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;
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 00: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