AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Diese Funktion schneller machen?

Ein Thema von Pseudemys Nelsoni · begonnen am 8. Dez 2004 · letzter Beitrag vom 9. Dez 2004
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#11

Re: Diese Funktion schneller machen?

  Alt 9. Dez 2004, 09:47
Zitat von Robert Marquardt:
Wie waere es denn mit
Result := StringReplace(S, Ch + Ch, Ch, [rfReplaceAll]);
Dann muss nur noch auf ein Ch am Ende getestet werden.
Zitat von Pseudemys Nelsoni:
...es sollten keine funktionen aus der VCL verwendet werden.
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#12

Re: Diese Funktion schneller machen?

  Alt 9. Dez 2004, 10:29
Zitat von ibp:
Zitat von Robert Marquardt:
Wie waere es denn mit
Result := StringReplace(S, Ch + Ch, Ch, [rfReplaceAll]);
Dann muss nur noch auf ein Ch am Ende getestet werden.
Zitat von Pseudemys Nelsoni:
...es sollten keine funktionen aus der VCL verwendet werden.
StringReplace ist auch nicht Teil der VCL, sondern der RTL .
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#13

Re: Diese Funktion schneller machen?

  Alt 9. Dez 2004, 10:36
ok ok geb mich geschlagen, bitte nicht mit schneebällen werfen
  Mit Zitat antworten Zitat
Benutzerbild von sECuRE
sECuRE

Registriert seit: 10. Apr 2003
Ort: Heidelberg
360 Beiträge
 
Delphi 7 Professional
 
#14

Re: Diese Funktion schneller machen?

  Alt 9. Dez 2004, 12:56
Hi,

spaßeshalber hab ich mal 'nen vergleich zwischen StringReplace und Nelsonis Variante gemacht, raus kam bei StringReplace 1297 Ticks und bei der anderen lediglich 62 Ticks (bei jeweils 100000x aufrufen). Pos + StringReplace ist also definitiv die langsamere Methode

cu
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#15

Re: Diese Funktion schneller machen?

  Alt 9. Dez 2004, 17:36
@mütze: das ganze sollte wenn überhaupt nur die funktionen aus der Unit "System" bzw "Windows" verwenden

@jim: der + operator ist aber (unbedeutend?) schneller als inc().

@Robert: dann müsste ich die unit SysUtils einbinden.

Zitat:
statt immer s[i] und result[len] zu machen könntest du auch einen Pointer (PChar) verwenden, der immer erhöht wird.[/delphi]
das interessiert mich ^^, hast du ein beispiel dafür? ich arbeite kaum mit pchars
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#16

Re: Diese Funktion schneller machen?

  Alt 9. Dez 2004, 17:59
Zitat von Pseudemys Nelsoni:
Zitat:
statt immer s[i] und result[len] zu machen könntest du auch einen Pointer (PChar) verwenden, der immer erhöht wird.[/delphi]
das interessiert mich ^^, hast du ein beispiel dafür? ich arbeite kaum mit pchars
Kein Beispiel sondern deine Funktion direkt umgeschrieben:

Delphi-Quellcode:
function fmtstr(const s: string; const c: char): string;
var
  i, len : integer;
  ResLen : Integer;
  b : boolean;
  Start : Integer;
  resPtr : PChar;
  sPtr : PChar;

  endsPtr : Pchar;
begin
  if s <> 'then
  begin
    b := false;

    Len:=Length(s);
    setlength(result, len);
    Start:=1;
    sPtr:=Addr(s[1]);
    resPtr:=Addr(result[1]);
    endsPtr:=Addr(s[length(s)]);

    while (sPtr^=c) and (sPtr<endsPtr) do
    begin
      inc(Start);
      inc(sPtr);
    end;

    ResLen:=0;

    for i := Start to Len do
    begin
      if (sPtr^ <> c) or (not b) then
      begin
        resPtr^ := sPtr^;
        inc(resPtr);
        inc(ResLen);
      end;

      b:=sPtr^=c;

      inc(sPtr);
    end;
    if (resPtr-1)^ = c then
      setlength(result, reslen-1)
    else
      setlength(result, reslen);
  end;
end;
Sieht zwar Länger aus, denke aber, dass es so schneller ist, da die ganzen Indexzugriffe entfallen. Ist natürlich bissle kryptisch, wenn Fragen sind, dann frag.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  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
 
#17

Re: Diese Funktion schneller machen?

  Alt 9. Dez 2004, 18:54
Zitat von Pseudemys Nelsoni:
@jim: der + operator ist aber (unbedeutend?) schneller als inc().
wie soll das gehen wenn beide anweisungen den selben maschinencode erzeugen?

[edit]
Zitat von Meine OH:
...
X wird um 1 inkrementiert oder um N, wenn N angegeben ist. Das bedeutet, Inc(X) entspricht der
Anweisung X := X + 1, und Inc(X, N) ist mit der Anweisung X := X + N identisch. Inc generiert jedoch hochoptimierten Maschinencode und ist besonders für Schleifen geeignet.
...
if ThisPost is senseless then
ThisPost.WasPostedBy := SomeoneElse();
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#18

Re: Diese Funktion schneller machen?

  Alt 9. Dez 2004, 19:14
Zitat von Nothine:
wie soll das gehen wenn beide anweisungen den selben maschinencode erzeugen?
Zitat von Meine OH:
... Inc generiert jedoch hochoptimierten Maschinencode und ist besonders für Schleifen geeignet....
Sie generieren eben nicht identischen Maschienencode. Die OH sagt doch alles.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#19

Re: Diese Funktion schneller machen?

  Alt 9. Dez 2004, 20:28
danke jim, ich testes gleich mal

btw: in der OH steht irgendwo "Tipp: der + operator ist schneller als inc"
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#20

Re: Diese Funktion schneller machen?

  Alt 9. Dez 2004, 21:05
OT:
Zitat von Pseudemys Nelsoni:
danke jim, ich testes gleich mal

btw: in der OH steht irgendwo "Tipp: der + operator ist schneller als inc"
Da steht höchstens, dass + schneller als concat ist. Ich bezweifle einen Unterschied zwischen + und inc() im Kompilat.
  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:27 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