Einzelnen Beitrag anzeigen

Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#17

Re: Was ist schneller? function oder 3x stringreplace?

  Alt 24. Jan 2007, 21:28
Hallo,

ich möchte an meinen alten Thread anknüpfen, da meine jetzige Frage im Grunde auch was damit zu tun hat. Folgendes:

Ich muss Chars gegen Chars im Hex-Format austauschen.
Soweit so gut.

Meine erste Version schaut so aus:
Delphi-Quellcode:
  Text := StringReplace(Text, 'ü', Chr($81), [rfReplaceAll]);
  Text := StringReplace(Text, 'ä', Chr($84), [rfReplaceAll]);
  Text := StringReplace(Text, 'ö', Chr($94), [rfReplaceAll]);
  Text := StringReplace(Text, 'Ü', Chr($9A), [rfReplaceAll]);
  Text := StringReplace(Text, 'Ä', Chr($8E), [rfReplaceAll]);
  Text := StringReplace(Text, 'Ö', Chr($99), [rfReplaceAll]);
  Text := StringReplace(Text, 'ß', Chr($E1), [rfReplaceAll]);
  Text := StringReplace(Text, '²', Chr($FD), [rfReplaceAll]);
  Text := StringReplace(Text, '³', Chr($FE), [rfReplaceAll]);
  Text := StringReplace(Text, 'µ', Chr($E6), [rfReplaceAll]);

  Serial.TransmittText(Text);
Wie man sieht, wird dort 10x StringReplace aufgerufen, um jeweils ein Char gegen ein Char aus Hex-Werten zu ersetzen.
Funktioniert auch - nur da StringReplace langsam ist, dacht ich mir ich könnt es anders machen. Dafür hab ich mir diesen Code ausgedacht:
Delphi-Quellcode:
const
  Chars: array[1..10] of Char = ('ä', 'ö', 'ü', 'Ä', 'Ö', 'Ü', 'ß', '²', '³', 'µ');
  Bytes: array[1..10] of Byte = ($84, $94, $81, $8E, $99, $9A, $E1, $FD, $FE, $E6);

var
  i: Integer;
  j: Integer;
  S_Text: String;
  C_Char: Char;

begin
  SetLength(S_Text, length(Text));

  S_Text := '';

  for i := 1 to length(Text) do
    begin
      C_Char := Text[i];

      for j := Low(Chars) to High(Chars) do
        If Chars[j] = C_Char then
          begin
            C_Char := Chr(Bytes[j]);
            break;
          end;

      S_Text := S_Text + C_Char;
    end;

  Serial.TransmittText(S_Text);
Ich vermute mal, dass dieser Code schneller ist als 10x StringReplace.
Was vermutet ihr?

Auch wenn´s etwas OT ist, bringt diese Zeile überhaupt was
  SetLength(S_Text, length(Text));
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat