Hi @ all,
ich habe mich auch mal mit dem Thema auseinader gesetzt und habe eine "IntLength"-Funktion entworfen, welche
ohne strings die Länge eines
Integers bestimmen kann.
Delphi-Quellcode:
function IntLength(AInt : Integer) : Integer;
begin
Result := 0;
while AInt > 0 do
begin
AInt := AInt div 10;
inc(Result);
end;
end;
Ich habe mal ein Test gemacht: Bei mir braucht die string-Variante für 900.001 Durchläufe ~ 255 ms. Die IntLength-Variante jetzt schon nur ~ 188 ms.
Vielleicht kennt ihr eine Möglichkeit den obigen Code zu optimieren

Vielleicht mit
ASM? Da müsste ich aber passen

da für mich
ASM im FoW liegt xD
Zusätzlich hier meine ExtLength-Variante:
Delphi-Quellcode:
function ExtLength(AExt : Extended) : Integer;
begin
Result := IntLength(Trunc(AExt));
end;
Sie berechnet leider nicht die Nachkommastellen, allerdings weiß ich nicht ob man die mitdazu rechnet.
Ich werde mir mal überlegen wie man das hinkriegen könnte.
[edit]Ich habe mir jetzt mal überlegt: Ich könnte die Vorkommastellen abschneiden und dann solange multiplizieren bis ich keine Nachkommastellen mehr habe.
Also habe ich das so gelöst:
Delphi-Quellcode:
{ Returns the length of a float (e.g. ExtLength(4365.87) = 6) }
function ExtLength(AExt : Extended) : Integer;
var
ABuf : Extended;
begin
Result := IntLength(Trunc(AExt));
ABuf := AExt - Trunc(AExt);
while Trunc(ABuf) < ABuf do
begin
ABuf := ABuf * 10;
inc(result);
end;
end;
Das Problem scheint zu sein, dass ABuf nicht genau eine Ganzzahl ist. Deshalb klemmt er sich da in eine Endlosschleife. (Wenn Trunc(ABuf) = 87 und ABuf 87 ist, beendet er nicht die Schleife)[/edit]
MfG
xZise
PS: string: ~437 ms; extLength: ~250 ms