Einzelnen Beitrag anzeigen

samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#5

Re: Geschwindigkeit einer Rekursion unter D2010 erhöhen

  Alt 10. Mär 2010, 10:29
Die eigentliche Frage
Zitat:
Was kann ich tun, um trotzdem CarriageReturn/Linefeeds und Spaces in meiner Ausgabe zu erhalten, ohne das die
Geschwindigkeit wieder zusammenbricht?
kann ich leider auch nicht beantworten. Ich finde diese Erscheinung auch erstmal erstaunlich. Ist die Compiler-Option "String-Formatprüfung" eingeschaltet? Wie ist es, wenn Du nur "Idnt: '';" setzt, aber CrLF=#13#10 lässt? Mir fällt eigentlich nur auf, dass der Compiler bei der Sequenz:
Result := Expand(Result + CrLf, Indent + Idnt, Elements[i].Elements) + Indent; mit CrLf='' und Idnt='' keine temporären Strings für "Result + CrLf" und "Indent + Idnt" erstellen muss. Da auch Indent dann leer bleibt, reduziert sich der Aufruf dann in der Konsequenz auf
Result := Expand(Result, '', Elements[i].Elements)); Hier würde ich vielleicht ansetzten. Ich hoffe, ich habe keinen fürchterlichen Denkfehler gemacht, aber geht es auch so???
Delphi-Quellcode:
  procedure Expand(const Indent: string; const Elements: TXmlElements);
  var
    i: Integer;
    Content: string;
    SmartEnd: Boolean;
  begin
    for i := 0 to Elements.Count - 1 do
    begin
      Result := Result + Indent + '<' + Elements[i].Name;
      Content := Trim(Elements[i].Content);
      SmartEnd := not((Content <> '') or (Elements[i].Elements.Count > 0));
      if not(SmartEnd) then
        Result := Result + '>' + Content;
      if Elements[i].Elements.Count > 0 then
      begin
        Result := Result + CrLf;
        Expand(Indent + Idnt, Elements[i].Elements) + Indent;
      end;
      if not(SmartEnd) then
        Result := Result + '</' + Elements[i].Name + '>'
      else
        Result := Result + '/>';
      Result := Result + CrLf;
    end;
  end;
Falls ich mir das korrekt überlegt haben sollte, würde man ziemlich oft das Kopieren des Result-Strings vermeiden.
  Mit Zitat antworten Zitat