AGB  ·  Datenschutz  ·  Impressum  







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

WideSameText und co. sehr langsam!

Ein Thema von olee · begonnen am 28. Aug 2011 · letzter Beitrag vom 28. Aug 2011
Antwort Antwort
Benutzerbild von olee
olee

Registriert seit: 16. Feb 2008
Ort: Boppard
540 Beiträge
 
Turbo Delphi für Win32
 
#1

WideSameText und co. sehr langsam!

  Alt 28. Aug 2011, 16:46
Delphi-Version: 2006
Hallo alle zusammen!

Ich habe mich in letzter Zeit etwas mit WideStrings in Turbo Delphi beschäftigt und dabei festgestellt, dass die Utility-Funktionen für diese verdammt lahm sind.

Als ich der Sache nachgegangen bin ist mir auch schon schnell aufgefallen wieso:
Diese Funktionen rufen teilweise extra Windows-Funktionen auf!
So z.B. bei WideSameText welches intern CompareStringW aus der kernel32.dll aufruft.

Deshalb habe ich mich mal daran gemacht native alternativen für diese Methoden zu schreiben.
Diese erwiesen sich im Test mehr als das 4-fach so schnell sind wie die Originale aus der SysUtils unit.

Hier der Code:
Delphi-Quellcode:
// FASTER version of WideSameStr
function WideSameStr(const a,b: WideString): Boolean;
var
  ac, bc : PWideChar;
label
  ende_false, ende_true;
begin
// If Pointer(a) = Pointer(b) then
// begin
// Result := true;
// exit;
// end;
// If (length(a) <> length(b)) then
// begin
// Result := false;
// exit;
// end;
// If (length(a) = 0) then
// begin
// Result := true;
// exit;
// end;
  asm
    cmp eax, edx // a = b
    jz ende_true // --> return true
    test eax, eax // a = nil
    jz ende_false // --> return false

    mov ecx, [eax-$04]
    test ecx, ecx // length(a) = 0
    jz ende_false // --> return false
    cmp ecx, [edx-$04] // length(a) <> length(b)
    jz ende_true // --> return false
  end;
ende_false:
  Result := false;
  exit;
ende_true:

  ac := @a[1];
  bc := @b[1];
  repeat
    if ac^ <> bc^ then
    begin
      Result := false;
      exit;
    end;
    inc(ac);
    inc(bc);
  until ac^ = #0;
  Result := true;
end;

// FASTER version of WideSameText
function WideSameText(const a,b: WideString): Boolean;
var
  ac, bc : PWideChar;
label
  ende_false, ende_true;
begin
// If Pointer(a) = Pointer(b) then
// begin
// Result := true;
// exit;
// end;
// If (length(a) <> length(b)) then
// begin
// Result := false;
// exit;
// end;
// If (length(a) = 0) then
// begin
// Result := true;
// exit;
// end;
  asm
    cmp eax, edx // a = b
    jz ende_true // --> return true
    test eax, eax // a = nil
    jz ende_false // --> return false

    mov ecx, [eax-$04]
    test ecx, ecx // length(a) = 0
    jz ende_false // --> return false
    cmp ecx, [edx-$04] // length(a) <> length(b)
    jz ende_true // --> return false
  end;
ende_false:
  Result := false;
  exit;
ende_true:

  ac := @a[1];
  bc := @b[1];
  repeat
    if WideUpCase(ac^) <> WideUpCase(bc^) then
    begin
      Result := false;
      exit;
    end;
    inc(ac);
    inc(bc);
  until ac^ = #0;

  Result := true;
end;
Mit freundlichen Grüßen
Björn Zeutzheim
Björn Zeutzheim
Codename: Performancepumpe
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.169 Beiträge
 
Delphi 12 Athens
 
#2

AW: WideSameText und co. sehr langsam!

  Alt 28. Aug 2011, 16:59
Die APIs machen aber noch mehr, sie konvertieren nicht nur "billig" nach Uppercase, sondern vergliechen sprachabhängig und machen vorallem bei den CombinedChars einige zusätzliche Dinge.


á wird z.B. ähnlich eingeordnet, wie ´a .



Was bei den WideStrings auch noch einen sehr großen Einfluß besitzt ist, daß WideStrings keine Referenzzählung haben.

Ansonsten wurde inzwischen auch noch das FastCodeProjekt in Delphi integriert und der neue UnicodeString bügelt das Referenzzählungsproblem aus.
Manchmal kommt es mit auch so vor, als wenn der FastMM etwas schneller ist, als der OLE-MM, welcher von den APIs im WideString genutzt wird.


Was macht WideUpCase?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (28. Aug 2011 um 17:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von olee
olee

Registriert seit: 16. Feb 2008
Ort: Boppard
540 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: WideSameText und co. sehr langsam!

  Alt 28. Aug 2011, 17:06
DIe Frage ist: Wann braucht man schon diese Funktionalität?

Bzw. eher: möchte man das überhaupt so haben?
Björn Zeutzheim
Codename: Performancepumpe
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:00 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