Ich poste meine Assembler Version einfach mal.
Delphi-Quellcode:
function CharCountAsm(AStr: PChar
{ eax }; AChar: Char
{ dx }; len: Integer
{ ecx }): Integer;
label loop_start, loop_ende, ende;
asm
// Danke gammatester! - sorgt dafür dass scasw vorwärts und nicht rückwärts sucht
cld
// edi + ax für scasw initialisieren
mov edi, eax
mov ax, dx
// edx = char count := 0
xor edx, edx
loop_start:
repnz scasw
// bis zum nächsten Vorkommen "vorspulen"
jcxz loop_ende
// Wenn String zu Ende, aus Schleife springen
inc edx
// Vorkommen des Chars mitzählen
jmp loop_start
loop_ende:
jnz ende
inc edx
// Falls der letzte Buchstabe noch ein Treffer war
ende:
mov result, edx
end;
i := CharCountAsm(@Data[1], '
X', Length(Data));
Damit erreiche ich momentan den 2. Platz im Benchmark (CountCharInString gewinnt).
ACHTUNG: Da scheint auch noch irgendwo ein kleiner Denkfehler drin zu sein
In (relativ) seltenen Fällen zählt mein Code aus irgendeinem Grund falsch.
Falls jemand eine Idee hat wo der Fehler ist oder wie man den Code generell noch verbessern/verschnellern kann wäre das super!
64-Bit ginge natürlich auch, aber habe wenig Erfahrung mit 64 Bit Assembler, deswegen lasse ichs erst mal.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."