AGB  ·  Datenschutz  ·  Impressum  







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

Diese funktion schneller machen?

Ein Thema von Pseudemys Nelsoni · begonnen am 29. Okt 2004 · letzter Beitrag vom 2. Nov 2004
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

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

Diese funktion schneller machen?

  Alt 29. Okt 2004, 12:42
moin,

ich habe vor langer zeit mal folgende funktion geschrieben, die ich SEHR oft benutze (meistens zum parsen):

Delphi-Quellcode:
function GetTok(str: string; Tok: integer; sep: char): string;
var
  index: integer;
begin
  result := '';
  if (str = '') or (str = sep) or (Tok < 1) or (sep = '') then
    exit;
  if (pos(sep, str) = 0) and (Tok = 1) then
  begin
    result := str;
    exit;
  end;
  str := str + sep;
  while pos(sep+sep, str) > 0 do
    delete(str, pos(sep+sep, str), 1);
  if pos(sep, str) = 1 then
    delete(str, 1, 1);
  index := 1;
  while pos(sep, str) > 0 do
  begin
    if Tok = index then
    begin
      result := copy(str, 1, pos(sep, str)-1);
      exit;
    end
    else
    begin
      delete(str, 1, pos(sep, str));
      inc(index);
    end;
  end;
end;
ich rufe sie z.b so auf:

Delphi-Quellcode:
MeinString := 'Dies ist ein string';
s := GetTok(MeinString, 2, ' ');
das ergebnis wäre dann:

Zitat:
ist
nur sieht mir die funktion ziemlich lang aus und frage mich daher ob sie mein programm vielleicht langsam macht und es evtl eine schnellere variante gibt? (natürlich one stringlist...)
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Diese funktion schneller machen?

  Alt 29. Okt 2004, 12:45
Mittels der Unit StrUtils geht es auf jedenfall kürzer, ob der Code dann schneller ist, weiß ich nicht.

Du kannst dann nämlich Delphi-Referenz durchsuchenPosEx verwenden.

Edit: Welche Funktion hinter PosEx steckt, weiß ich allerdings auswendig nicht.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Diese funktion schneller machen?

  Alt 29. Okt 2004, 12:46
Hi,

einmal gibt es da das ExplodeExplode in der Code Library, dass einen String nach einem Seperator auflistet.

In deiner Funktion könntest Du noch das "const" vor dem String Parameter ergänzen.

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

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

Re: Diese funktion schneller machen?

  Alt 29. Okt 2004, 12:48
hallo matze,

wie bekomme ich denn mit posex() den teil den ich aus dem hauptstring möchte? wie ich sehe gibt posex einen integer und kein string zurück

hallo mirage, stimmt, const könnt ich noch dranhängen, danke
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Diese funktion schneller machen?

  Alt 29. Okt 2004, 12:52
Du bekommst den Index eines Strings, ab einer bestimmten Position und kann dir dann die 2 Indizes (in deinem Fall meistens Leerzeichen) merken und mittels Copy den String erhalten.
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#6

Re: Diese funktion schneller machen?

  Alt 29. Okt 2004, 12:56
Dein Problem lässt sich allgemein, wenn ich es richtig erkenne, wie folgt beschreiben:
Code:
Gib genau den Teil eines Strings zurück, der durch bestimmte Kriterien eingegrenzt ist.
Um diese Grenzen gemäß Deiner Kriterien zu ermitteln, verwendest Du allerdings recht rechenintensive Stringoperationen wie "Konkatenation", "Löschen von Zeichen", ...

Versuche stattdessen die Kriterien zu überprüfen, ohne die Strings zu verändern (zB über die Zeichenpositionen innerhalb des Strings), so dass folgender Pseudo-Code schneller zum Ergebnis führt:
Delphi-Quellcode:
function CalcBoundInStringStartingAt(const AString: string;
  const AStart: Index; ...): Integer;
begin
  Result := AStart;
  while Result<Length(AString) and not DoesCriteriaMatch(...) do
    Inc(Result);
end;

function GetTok(const AString: string; ...): string;
var
  myLowerBound: Integer;
  myUpperBound: Integer;
begin
  myLowerBound := CalcBoundInStringStartingAt(AString, 1, ...);
  myUpperBound := CalcBoundInStringStartingAt(AString, Succ(myLowerBound), ...);
  
  UseBoundsToObtainResult(AString, myLowerBound, myUpperBound);
end;
Zu beachten sind selbstverstädnlich die Grenzfällen, bei denen die Kriterien nicht erfüllt sind, etc.
gruß, choose
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.017 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

Re: Diese funktion schneller machen?

  Alt 29. Okt 2004, 13:00
Hi,
Delphi-Quellcode:
function GetTok(str: string; Tok: integer; sep: char): string;
var
  i, j: integer;
  b: Boolean;
  pos: Integer;
begin
  Result := '';
  if (Sep = '') or (Tok < 1) then
    Exit;
  j := 1;
  b := False;
  pos := 0;
  for i := 1 to length(str) do
  begin
    if str[i] = sep then
    begin
      if not b then
      begin
        Inc(j);
        b := True;
      end;
      if j > Tok then
        Break
      else
        Continue;
    end
    else
      b := False;
    if (pos = 0) and (j = Tok) then
      pos := i;
  end;
  if Pos > 1 then
    Result := Copy(str, pos, i - pos);
end;
ist in jedem meiner Testfälle schneller als deine Funktion.

MfG
Stevie

P.S. Gibt's PosEx erst in Delphi7? Hab hier Delphi6Pro an der Arbeit und find das Teil nicht!?
Edit: Nochmal geändert...
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#8

Re: Diese funktion schneller machen?

  Alt 29. Okt 2004, 16:25
Delphi-Quellcode:
function ExtractToken(const Text: String; Index: Integer; const Seperator: Char = ' '): String;
var
  S,D: PChar;
begin
  S := PChar(Text);
  while (S^ <> #0) and (Index > 0) do
  begin
    if S^ = Separator then Dec(Index);
    Inc(S);

// falls mehrere Seperatoren nacheinander möglich sind, ohne Index zu ändern dann so
//
// if S^ = Seperator then
// begin
// Dec(Index);
// repeat
// Inc(S);
// until S^ <> Seperator;
// end else Inc(S);
  end;
  D := S;
  while (D^ <> #0) and (D^ <> Separator) do
    Inc(D);
  SetString(Result, S, D - S);
end;
Gruß Hagen
  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
 
#9

Re: Diese funktion schneller machen?

  Alt 29. Okt 2004, 23:13
Zitat von negaH:
S := PChar(Text);
wäre
S := Pointer(Text); nicht schneller?
if ThisPost is senseless then
ThisPost.WasPostedBy := SomeoneElse();
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#10

Re: Diese funktion schneller machen?

  Alt 30. Okt 2004, 00:08
Warum sollte es ?

Gruß Hagen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 07:53 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