INT : Fonction trop lente

Archive.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

pourquoi j'ai pas fait en ASM ?

Je n'y connais rien en ASM, voila pourquoi :)

En plus, ton code ASM ne fonctionne pas correctement
5.958741545 donne 6 au lieu de 5



En tout cas, j'ai mis un beau bordel sur le fofo anglais, pas mal de monde propose des solutions plus rapide que Int

J'ai tout testé, je reste le plus rapide avec ma bête fonction sans asm.
Dernière modification par Le Soldat Inconnu le mer. 27/mai/2009 19:36, modifié 1 fois.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
KrisJNT
Messages : 110
Inscription : ven. 31/oct./2008 16:51

Message par KrisJNT »

ben tu fais -1 après ! :D
Mais j'avoue que ça m'épate de voir ça. Pourquoi ne pas proposer ce code aux créateurs de PB ?
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message par erix14 »

En plus, ton code ASM ne fonctionne pas correctement
5.958741545 donne 6 au lieu de 5
J'aurais plutôt dit que c’était ton code :lol: Pour moi, c'est plus logique que 5.958741545 donne 6, mais si tu souhaites seulement la partie entière du nombre réel, pas de problème :

Code : Tout sélectionner

Tronc.w = $0FFF
FLDCW Tronc
Macro FloatToInt(float,long)
	FLD float
	FISTP long
EndMacro

Float1.f = 5.958741545
Float2.f = 5
#Nb = 50000000
Time1 = ElapsedMilliseconds()

For i = 1 To #Nb
	Long11.l = Int(Float1)
	Long12.l = Int(Float2)
Next

Time2 = ElapsedMilliseconds()

For i = 1 To #Nb
	Long21.l
	FloatToInt(Float1,Long21)
	Long22.l
	FloatToInt(Float2,Long22)
Next

Time3 = ElapsedMilliseconds()

Texte.s = "Int :" + Chr(10) + "Time = " + Str(Time2 - Time1) + " ms" + Chr(10) + StrF(Float1) + " -> " + StrF(Long11) + Chr(10) + StrF(Float2) + " -> " + StrF(Long12) + Chr(10) + Chr(10) + "IntASM :" + Chr(10) + "Time = " + Str(Time3 - Time2) + " ms" + Chr(10) + StrF(Float1) + " -> " + StrF(Long21) + Chr(10) + StrF(Float2) + " -> " + StrF(Long22) + Chr(10) + StrF((Time2 - Time1) / (Time3 - Time2), 1) + " time more fast"
SetClipboardText(Texte)
MessageRequester("Test", Texte)
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message par erix14 »

Dobro a écrit :
erix14 a écrit :@lionel_om : Bien sûr, c'est une évidence... dans cet exemple, une macro est plus qu'indiqué, car le code est très petit et le CPU passe plus de temps sur l'appel de la procédure que sur le contenu de la procédure. :wink:
oui mais dans la mesure ou pour le purebasic, il s'agit bien d'une fonction 'int()'
je crois que de le faire en fonction est plus judicieux !!

le but final serai de remplacer celle existante :)
Ne crois pas que toutes les fonctions de PureBasic soit toutes de "vraies" fonctions, certaines sont directement remplacées par du code ASM, comme par exemple certaines fonctions de math...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

erix14 a écrit :Ne crois pas que toutes les fonctions de PureBasic soit toutes de "vraies" fonctions, certaines sont directement remplacées par du code ASM, comme par exemple certaines fonctions de math...
ha bon !? effectivement dans ce cas :lol:
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Message par Fig »

J'aurais plutôt dit que c’était ton code :lol: Pour moi, c'est plus logique que 5.958741545 donne 6
Bein non... Il n'est pas question de logique, juste de l'instruction int() qui n'effectue pas un arrondi mais en fait tronque la partie décimale ou on peut aussi dire qu'elle fait un arrondi à l'unité inférieur... (sinon il faut utiliser Round()...)
Dernière modification par Fig le jeu. 28/mai/2009 13:05, modifié 1 fois.
jerexgrz
Messages : 279
Inscription : dim. 05/juin/2005 20:27

Message par jerexgrz »

concernant le 1er exemple: j'obtiens ca:

Int:
time=7250 ms

float:
time=5375 ms

1.3 time more fast.

RQ: J'ai un amd 5200+.
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message par erix14 »

@Fig : Et bien si, c'est une question de logique, car si on transforme un nombre réel en un entier il est plus logique que ce nombre se rapproche le plus du nombre réel... Imagine que tu fasses un logiciel de dessin et qu’après des calculs tu doives afficher des points dont les coordonnées sont en nombre réel, et bien les contours de ton dessin seront plus jolis avec un arrondi qu'en tronquant les nombres. Maintenant, un autre exemple, je parcoure 5.9 km, est-ce que je vais dire : J'ai parcouru environ 5 km... ou j'ai parcouru environ 6 km ?

Oui, la fonction int() fait un arrondi à l'unité inférieur alors pourquoi ne pas l'appeler tout simplement floor()... :roll:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

erix14 a écrit : Oui, la fonction int() fait un arrondi à l'unité inférieur alors pourquoi ne pas l'appeler tout simplement floor()... :roll:

hooo! stop la !! :)

la fonction int() a toujours fait partie du langage Basic (1964) !!
deja le ZX81 l'implémentait , le TI99/4A aussi !, et quasi tout les autre micro ordinateur a base de Basic :)



et effectivement il s'agit de tronquer la partie entière SANS ARRONDIR !!
"int" viens de "integer" => "partie entiere"
pour arrondir il existe depuis toujours une autre fonction Round()

purebasic se veux un Basic, au moins respectons ça ! ;)
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Message par Fig »

erix14 a écrit : Oui, la fonction int() fait un arrondi à l'unité inférieur alors pourquoi ne pas l'appeler tout simplement floor()... :roll:
Moi je propose 'iwalkedmorekm()' :P

Oui, j'avais bien compris que c'était logique dans notre monde analogique de marcheurs prétentieux :wink:
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

pas mal, Erix14 :)

Et Int() , c'est juste la partie entière d'un flottant, pas un arrondi.
En pascal, c'est pareil, en VB, etc...
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message par tonton »

8)
a=Int(5.9999999999999999)
Debug a
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

tonton a écrit :8)
a=Int(5.9999999999999999)
Debug a
:lol: en plus ça bug !! :lol:

ça sort 6 au lieu de 5 !!! :?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

purée !!

normal , A est un entier !!
donc 5.9999 , c'est un arrondi en fait !! :)

bon je retourne dans les doc sur Tahiti moi :)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Dobro a écrit :purée !!

normal , A est un entier !!
donc 5.9999 , c'est un arrondi en fait !! :)

bon je retourne dans les doc sur Tahiti moi :)
:lol:
C'est pas ça du tout, mais bon! mdr!
Répondre