AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

string zum array of char

Ein Thema von Snoop007 · begonnen am 18. Aug 2004 · letzter Beitrag vom 19. Aug 2004
Antwort Antwort
Seite 2 von 2     12
Snoop007

Registriert seit: 14. Jan 2003
331 Beiträge
 
Delphi 6 Personal
 
#11

Re: string zum array of char

  Alt 18. Aug 2004, 20:56
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 !
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#12

Re: string zum array of char

  Alt 18. Aug 2004, 23:48
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 !!
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 .


gruss, ein verdutzter
dizzy
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von Nothine
Nothine

Registriert seit: 3. Jul 2004
Ort: Mülheim an der Ruhr
198 Beiträge
 
Delphi 5 Enterprise
 
#13

Re: string zum array of char

  Alt 19. Aug 2004, 00:03
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...
if ThisPost is senseless then
ThisPost.WasPostedBy := SomeoneElse();
  Mit Zitat antworten Zitat
Snoop007

Registriert seit: 14. Jan 2003
331 Beiträge
 
Delphi 6 Personal
 
#14

Re: string zum array of char

  Alt 19. Aug 2004, 00:35
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
..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 )
beim casten werden auch alle zeichen werden kopiert
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#15

Re: string zum array of char

  Alt 19. Aug 2004, 01:39
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.
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#16

Re: string zum array of char

  Alt 19. Aug 2004, 02:31
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 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 .
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
ripper8472

Registriert seit: 17. Aug 2003
275 Beiträge
 
#17

Re: string zum array of char

  Alt 19. Aug 2004, 02:38
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
Christoph
char l[]="\xd6N\x96\xa6\xe6\xce.\xa6\xe4\xce\x04N\x86\xae\ xce\xfc",I,*i=l-1;for(;I=3,*i
++;){while(*i=*i&~(1<<I|1<<7-I)|(*i&1<<I)<<7-2*I|(*i&1<<7-I)>>7-2*I,I--);}puts(l);
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#18

Re: string zum array of char

  Alt 19. Aug 2004, 02:48
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.
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von Nothine
Nothine

Registriert seit: 3. Jul 2004
Ort: Mülheim an der Ruhr
198 Beiträge
 
Delphi 5 Enterprise
 
#19

Re: string zum array of char

  Alt 19. Aug 2004, 03:06
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
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;
if ThisPost is senseless then
ThisPost.WasPostedBy := SomeoneElse();
  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 15:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf