Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen

  Alt 6. Jul 2022, 20:33
Der Funktionsaufruf ist nur einen "Hauch" langsamer ('ne Hand voll CPU-Takte),
dagegen beim case-insensitven braucht der eine Parameter nur einmal kleingemacht werden, anstatt mehrmal je Zeile/IF.

Delphi-Quellcode:
// turborennschnecke
if TArray.BinarySearch(['a', 'b', 'c'], AnsiLowerCase(S)) // kleingeschrieben und sortiert

// und natürlich ist ein
if AnsiIndexStr(AnsiLowerCase(S), ['a', 'b', 'c']) // Suchwerte direkt kleingeschrieben
// schneller/optimaler als ein
if AnsiIndexText(S, ['A', 'B', 'C'])
// und noch schneller als
if AnsiIndexStr(AnsiLowerCase(S), [AnsiLowerCase('A'), AnsiLowerCase('B'), AnsiLowerCase('C')])
// fast gleichschnell wie
K := AnsiLowerCase(S);
if K = AnsiLowerCase('A')
if K = AnsiLowerCase('B')
if K = AnsiLowerCase('C')
// aber schneller als
if AnsiLowerCase(S) = AnsiLowerCase('A')
if AnsiLowerCase(S) = AnsiLowerCase('B')
if AnsiLowerCase(S) = AnsiLowerCase('C')
// und die bummelschnecke
die RTTI (siehe vorher) ist am Kürzesten, aber dafür ist "langsam" etwas untertrieben ... aber eben einfach ... dagegen aber auch vom Compiler nicht validierbar, weil erst zur Laufzeit
Letztes wie die vielen IFs
und die ersten Beiden ... halt wie der Code schöner Lesbar ist.

Kommt halt drauf an, wie man es sieht ... lieber 'nen Hauch langsamer, aber dafür einfach/lesbar, oder eben nur schnell.
AnsiIndexStr(AnsiLowerCase(S), ['FirstFilename', 'CheckIfFilesExist', ...])

AnsiIndexText(S, ['firstfilename', 'checkiffilesexist', ...])

Wobei schnell, da nimmt man dann ein Directory, bzw. eine "sortierte" Liste/Array und macht dann eine binäre Suche (Delphi-Referenz durchsuchenTArray.BinarySearch, bzw. im Datenbank-Sprech: IndexScan), anstatt einer Volltextsuche (FullTableScan).



Delphi-Quellcode:
// AnsiIndexStr ist wie

if S = 'Athen ...
else if S = 'Bthen ...
else if S = 'Cthen ...

if AnsiSameStr(S, 'Athen ...
else if AnsiSameStr(S, 'B') then ...
else if AnsiSameStr(S, 'C') then ...

// AnsiIndexText ist wie

if AnsiLowerCase(S) = AnsiLowerCase('A') then ...
else if AnsiLowerCase(S) = AnsiLowerCase('B') then ...
else if AnsiLowerCase(S) = AnsiLowerCase('C') then ...

if AnsiSameText(S, 'A') then ...
else if AnsiSameText(S, 'B') then ...
else if AnsiSameText(S, 'C') then ...
Vorteil von IndexText vs. SameText/LowerCase ist, dass das S nur einmal, anstatt in jeder Zeile neu angepasst wird.
$2B or not $2B

Geändert von himitsu ( 6. Jul 2022 um 20:45 Uhr)
  Mit Zitat antworten Zitat