Seite 1 von 2

Modulo-Funktion

Verfasst: 07.12.2005 11:02
von DarkCrow
Hallo PB-Gemeinde,

ich hab mal wieder ein Problem das mich schon mehrere Tage beschäftigt :)

Mein Problem ist, das ich eine schnellere Modulo-Funktion bräuchte ...

Meine Idee war die Modulo Funktion selbst zu schreiben:

ca. so: (zahl1/zahl2-Int(zahl1/zahl2))*zahl2

und hier mein PB-Test-Proggi :D

Code: Alles auswählen

NewList MyList.l()

For i.l = 1 To 10000000
  AddElement(MyList())
  MyList() = i
Next

; PureBasic-Modulo-Funktion-Funktionstest
temp.l = 0
ResetList(MyList())
puretick.l = GetTickCount_()
For i.l = 1 To CountList(MyList())
  NextElement(MyList())
  temp = (MyList() % 13)
Next

; Meine-Modulo-Funktion-Funktionstest
temp.l = 0
ResetList(MyList())
mytick.l = GetTickCount_()
For i.l = 1 To CountList(MyList())
  NextElement(MyList())
  f1.f = MyList() / 13
  temp = (f1-Int(f1))*13
Next

MessageRequester("Ergebnis","PureBasic-Modulo-Funktion: " + Str((GetTickCount_() - puretick)) +"msec." + #CRLF$ + "My-Modulo-Funktion: " + Str((GetTickCount_() - mytick)) +"msec.")
gibt es eine noch schnellere Möglichkeit?

Hier meine Ergebnisse:
Athlon XP +1800 (1.54Ghz)
512 MB Ram
Windows XP
Test 1:
PBModulo: 1250msec.
myModulo: 640msec.
Test 2:
PBModulo: 1266msec.
myModulo: 641msec.
Test 3:
PBModulo: 1297msec.
myModulo: 688msec.


Dell PowerEdge 1420
1GB Ram
Windows Server 2003 Standard
Test 1:
PBModulo: 703msec.
myModulo: 437msec.
Test 2:
PBModulo: 688msec.
myModulo: 422msec.
Test 3:
PBModulo: 703msec.
myModulo: 437msec.


gruß Markus

Verfasst: 07.12.2005 11:45
von Zaphod
ich hoffe du hast auch mal einen test ohne debugmodus laufen lassen, der bremst nämlich die pb funktionen beachtlich.

Verfasst: 07.12.2005 12:35
von DarkCrow
jab ... die Tests sind ohne Debug Funktion :cry:

Re: Modulo-Funktion

Verfasst: 07.12.2005 12:37
von Danilo
DarkCrow hat geschrieben:gibt es eine noch schnellere Möglichkeit?
Das Mod von PB (%) ist schneller als Deine Methode. Du stoppst
puretick.l und mytick.l aber beide erst im MessageRequester am
Ende. Das heißt Dein puretick beinhaltet immer PB Mod + Dein Mod,
ist also logischerweise langsamer als nur Dein Mod. :D

Da Floats nicht genau sind, habe ich auch starke Zweifel das
Deine Vorgehensweise überhaupt dafür geeignet ist.
PB verwendet für Mod bestimmt IDIV, also vorzeichenbehaftete
Division in ASM. Bei DIV und IDIV wird nicht nur das Ergebniss,
sondern auch der Rest der Division, zurückgegeben. Bei 32-bit
in EDX, bei 16-bit in DX, bei 8-bit in AH.

Verfasst: 07.12.2005 12:42
von Batze
Wenn man den 2. Wert vom ersten abzieht sieht man aber doch was schneller ist.

Verfasst: 07.12.2005 12:52
von Danilo
Batze hat geschrieben:Wenn man den 2. Wert vom ersten abzieht sieht man aber doch was schneller ist.
In Deinem 1.Beitrag sieht es so aus als wenn Du meinst
Dein Mod sei schneller, da Du Dich so freust und fragst
was es noch schnelleres gibt.
Deshalb dachte ich Du meinst Deine Methode wäre doppelt
so schnell wie PB. Sehr komische Ergebnissanzeige, denn
dort steht nicht das man den zweiten Wert beim Ersten
abziehen soll. Dort stehen 2 Ergebnisse in msec.

Mach einfach weiter so. Geht mich ja nix an, wenn Du das
absichtlich so blöd machst um die Leute zu verarschen. ;)

Verfasst: 07.12.2005 13:04
von Batze
@Danilo: Das Programm hab ich doch garnicht gepostet das war Dark Crow. /:->

Ich wollte nur sagen dass man trotzdem die korrekten Werte ablesen kann, was er natürlich auch hätte machen (am besten auch einbauen) sollen.
Danilo hat geschrieben: Geht mich ja nix an, wenn Du das
absichtlich so blöd machst um die Leute zu verarschen. :wink:
Das wollen wir ihm doch nicht vorwerfen. Lieber Unwissenheit. :wink:

Verfasst: 07.12.2005 13:09
von Danilo
Batze hat geschrieben:@Danilo: Das Programm hab ich doch garnicht gepostet das war Dark Crow. /:->
Nur hör' endlich auf mich zu verarschen! :lol:

Habs gerade schon gecheckt. ;)
Dachte das war wieder der original Fragesteller, da er ja 2
Minuten vor mir auch schon geantwortet hatte. Kann also
immernoch sein das dies ein Fehler von DarkCrow war und
er meinte sein Mod ist schneller.
Was mußt Du Dich da auch einmischen? ;) :D

Verfasst: 07.12.2005 20:25
von DarkCrow
oh man ... ich bin doch ein depp :oops:

sorry leuts ... :(

Verfasst: 07.12.2005 20:49
von Kaeru Gaman
@Dark Crow

siehst mal so: genau dieser Fehler wird die niemals wieder passieren..


wozu brauchst du denn das modulo?

wenn du deine datenbeschaffenheit so einrichten kannst, daß dir 2er potenzen genügen,
fährts du gut mit einem AND, was natür extrem viel schneller ist.