AGB  ·  Datenschutz  ·  Impressum  







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

"Zeichen" im Integer

Ein Thema von xZise · begonnen am 19. Jan 2007 · letzter Beitrag vom 19. Jan 2007
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#11

Re: "Zeichen" im Integer

  Alt 19. Jan 2007, 13:57
Ich nehme mal an, auch mit Assembler wird es nicht recht viel schneller gehen. Das einzige, was man hier ausnutzen kann, ist diese Schweinerei mit cdq, bringt aber auch nicht recht viel, wenn überhaupt was.

Delphi-Quellcode:
function NumberLength(x: Integer): Integer;
asm
  push ebx
  mov ebx, 10
  cdq
  mov ecx, edx
  and ecx, 1
  xor eax, edx
  sub eax, edx
  @loop:
  and eax, eax
  jz @endloop
  mov edx, 0
  div ebx
  add ecx, 1
  jmp @loop
  @endloop:
  mov eax, ecx
  pop ebx
end;
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#12

Re: "Zeichen" im Integer

  Alt 19. Jan 2007, 14:58
Ich wuerde sagen, die staendige Division ist eine unnoetige Bremse, die man nicht zwingend braucht.
Algorithmisch gesehen sollte das die schnellste Variante sein:
Delphi-Quellcode:
function DecIntLength(x: integer): byte;
const
  m: packed array[0..9] of integer = ($A, $64, $3E8, $2710, $186A0, $F4240, $989680, $5F5E100, $3B9ACA00, $0);
asm
   MOV EAX, x
   MOV ESI, m
   CDQ
   XOR EAX, EDX
   AND EDX, 1
   ADD EAX, EDX
@@loopstart:
   INC DL
   MOV EBX, [ESI]
   TEST EBX, EBX
   JZ loopend
   CMP EBX, EAX
   JA loopend
   ADD ESI, 4
   JMP loopstart
@@loopend:
   MOV AL, DL
end;
Ich hab leider keinen Delphicompiler installiert, aber ich sehe eigentlich keinen grund, warums nich laufen sollte

greetz
Mike

[Edit] and is schneller als sets, also her damit
[Edit2] und den test brauchma auch ned... hoff ich zumindest mal *g*
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#13

Re: "Zeichen" im Integer

  Alt 19. Jan 2007, 17:02
Und das ganze jetzt für den Int64

Ein Problem in deinem Code
Zitat:
[Pascal Fehler] uMain.pas(6): E2107 Operandengröße stimmt nicht überein
MOV ESI, m
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#14

Re: "Zeichen" im Integer

  Alt 19. Jan 2007, 18:01
Jason, warum schreibst du statt $A, $64,... nicht einfach 10, 100,...? Zur Verwirrung?
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#15

Re: "Zeichen" im Integer

  Alt 19. Jan 2007, 18:41
Zitat von 3_of_8:
Jason, warum schreibst du statt $A, $64,... nicht einfach 10, 100,...? Zur Verwirrung?
Nein, weil ich das array eigentlich mal in den Code-Block schieben wollte, damit ich nicht auf ein Sprach-abhaengiges array zurueckgreifen haette muessen. Hat aber nicht zu ganz geklappt, und hab aus Gewohnheit die Hex-Werte kopiert... Wenn ich Leute Verwirren will, sieht das anders aus
Na ja, das mit dem Array hatte dann auch zur folge, dass dann das geschriebene nichmehr kompiliert... warum auch immer Delphi was dagegen hat, nen Zeiger in ein 32-Bit-Register zu schreiben

Egal, es geht auch ohne assembler:
Delphi-Quellcode:
function DecIntLength(x: integer): byte;
const
  m: packed array[0..9] of integer = (10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000, 0);
var
  i: byte;
begin
  result := 0;
  i := 0;
  if (x < 0) then
  begin
    inc(result);
    x := -x;
  end;
  repeat
    inc(i);
  until ((m[i] = 0) or (m[i] > x))
  inc(result, i);
end;
Zitat von xZise:
Und das ganze jetzt für den Int64
Einfach alle integers durch int64 ersetzen, und folgendes fuer m nehmen:
m: packed array[0..17] of integer = (10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000, 10000000000, 100000000000, 1000000000000, 10000000000000, 100000000000000, 1000000000000000, 10000000000000000, 100000000000000000, 0); Wie gesagt: nicht probiert...

greetz
Mike
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
jmd anders

Registriert seit: 13. Mai 2004
84 Beiträge
 
#16

Re: "Zeichen" im Integer

  Alt 19. Jan 2007, 22:46
ich hab mal ein bißchen rumgetestet, auch mit assembler, bisher aber nur für 32bit integer.
Delphi-Quellcode:
function InlineAsm(x:integer) : integer;
const e=1;
      z=10;
      h=100;
      t=1000;
     zt=10000;
     ht=100000;
      m=1000000;
     zm=10000000;
     hm=100000000;
     md=1000000000;
    zmd=10000000000;
asm
  MOV EDX, EAX
  JMP @Ret1

  @Ret1 :
    CMP EDX,z
    JAE @Ret10
    MOV EAX, 1
    JMP @Ende;
  @Ret10 :
    CMP EDX,h
    JAE @Ret100
    MOV EAX, 2
    JMP @Ende;
  @Ret100 :
    CMP EDX,t
    JAE @Ret1000
    MOV EAX, 3
    JMP @Ende;
  @Ret1000 :
    CMP EDX,zt
    JAE @Ret10000
    MOV EAX, 4
    JMP @Ende;
  @Ret10000 :
    CMP EDX,ht
    JAE @Ret100000;
    MOV EAX, 5
    JMP @Ende;
  @Ret100000 :
    CMP EDX,m
    JAE @Ret1000000
    MOV EAX, 6
    JMP @Ende;
  @Ret1000000 :
    CMP EDX,zm
    JAE @Ret10000000
    MOV EAX, 7
    JMP @Ende;
  @Ret10000000 :
    CMP EDX,hm
    JAE @Ret100000000
    MOV EAX, 8
    JMP @Ende;
  @Ret100000000 :
    CMP EDX,md
    JAE @Ret100000000
    MOV EAX, 9
    JMP @Ende;
  @Ret1000000000 :
    MOV EAX, 10
    JMP @Ende;

 @Ende :
end;
das ist dabei rausgekommen, sehr ähnlich zu jason's asm funktion, nur ohne irgendwelche schleifen.
ich hab jason's asm funktion nicht getestet, aber seine delphi funktion, die war extrem schnell(7-8mal schneller als die asm funktion von 3_of_8).
ich hatte das gefühl, dass meine funktion einen tick schneller ist als die delphi funktion von jason(ich glaub nicht mal 1%)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 14:47 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