Page 7 sur 7

Publié : ven. 10/août/2007 6:03
par Ollivier
C'est clair que c'est une superbe chance l'asm intégré en PB.

Pour la vitesse d'exécution de PB, il n'y a que peu à dire puisque Fred a sûrement du utiliser l'Assembleur pour arriver à nous confectionner ce compilateur.

Enfin, pour ce qui est du code Asm à intégrer, là aussi, c'est clair, il ne faut pas pousser le 'bouchon' trop loin! >> une douzaine de ligne ASM bien expliquées, c'est largement suffisant pour combler les quelques rares lacunes de vitesse que peut rencontrer PB. Plus long que ça, c'est voué à rien, si ce n'est montrer que c'est possible d'écrire de l'asm!

Publié : jeu. 16/août/2007 2:16
par Kwai chang caine
Merci mon bon FLYPATOR de toutes ces précisions. 8)

Alors :

Vive PURE
Vive l'ASM
Vive FRED
Vive FREAK
Vive TOI

Et vive tout ceux qui sont assez callé pour pouvoir rendre encore plus puissant ce language, afin de repousser ses limites qui sont de plus en plus étendues.

Apres tout VB ne s'est pas fait en 4 ans....
Et quand on voit le résultat des dernieres version mega lourdes et complexes..... franchement....y'a pas photo.

@OLLIVIER
Il n'y a, a mon avis, pas que la vitesse.
Regarde le super code que tu as fait qui tue carrement la ligne dans un tableau.
Je ne pense pas qu'il y ai l'equivalent en PURE. :roll:

Publié : jeu. 16/août/2007 2:22
par Ollivier
Ben si, mais plus lentement.

Publié : jeu. 16/août/2007 2:29
par Kwai chang caine
Ah bon, bah je l'avais jamais vu 8O
J'essaierais de la chercher, car cela peut etre utile.

En plus tu m'avais dit que la tienne pouvait etre instable, alors peut etre qu'en pure elle est fiable.

Publié : jeu. 16/août/2007 2:40
par Ollivier
Que ce soit en Pure ou en Assembleur, il n'y a rien qui me prouve que mon algorithme est stable. Seul Fred peut apporter une réponse nette à 100%.

Nous, nous pouvons nous contenter de remplir des chaînes au hasard et de les killer au hasard pendant une demi-heure à raison d'un demi million de chaînes construites/détruites par seconde, le tout pendant une demi-heure. Après cette demi-heure, on pourra commencer à parler de fiabilité.

J'ai eu la flemme de faire un tel test.

Publié : jeu. 16/août/2007 2:41
par Kwai chang caine
D'accord, je te remercie de tes précisions.

Avec tous les codes que tu balance depuis le peu de temps que tu es dans la famille, je ne crois pas que le mot "flemme" soit bien approprié :D

Publié : jeu. 16/août/2007 4:46
par Ollivier

Code : Tout sélectionner

MessageRequester("a", "Cet exemple compare la rare et meilleure des instructions ASM avec l'équivalent PB")

St.S = ">>>>> REPNE SCASB <<<<<" + Chr(10)
St + "REPNE se traduit par «REPeat until a.l Not Equal b.l» a.L c'est EAX en ASM, b.L c'est le résultat d'un Peek(*Memoire)" + Chr(10)
St + "*Memoire est remplacé par EDI. EDI est incrémenté pour avancer dans la mémoire, c'est un peu comme si on écrivait *Memoire + 1, mais là c'est EDI + 1" + Chr(10)
St + "Enfin la variable ECX gère la limite au cas où on ne trouve pas la valeur cherchée dans EAX." + Chr(10) + Chr(10)
St + "Equivalent de REPNE SCASB:" + Chr(10)
St + "For ECX = 99999999 To 0 Step -1" + Chr(10)
St + "If PeekB(EDI) = EAX: Break: EndIf" + Chr(10)
St + "Inc EDI" + Chr(10)
St + "Next" + Chr(10) + Chr(10)
St + "Application: *Cherche un pixel noir sur une image quelconque" + Chr(10)
St + "*Cherche le code (0) de fin de chaîne) Tout est question d'adaptation des valeurs des registres ci-dessus." + Chr(10)
St + "En outre, avec quelques réglages de son orthographe (REP[E|NE|Z|NZ] [SCA|STO|OUT|CMP|IN]S[B|W|D]), on" + Chr(10)
St + "obtient les 59 dérivations «soeur» de REPNE SCASB." + Chr(10)

MessageRequester("a", St)
 
MessageRequester("a", "Maintenant, place au test, une zone mémoire fait office de tableau = x.S(1999, 255)." + Chr(10) + "On va demander de rechercher la dernière chaîne du tableau dans les 2 langages." + Chr(10) + "Ce qui n'est pas une mince affaire, Car il faut fouiller les 512000 chaînes précédentes octets par octets..." + Chr(10) + "Patientez le temps de remplir le tableau...")

*x = AllocateMemory(1 << 28)
*Limit = *x + MemorySize(*x)

Global DimQty.L
DimQty = 2
Global Dim Ubound.L(15)
Ubound(0) = 1999
Ubound(1) = 255
Global Dim Posi.L(15)
Posi(0) = 1999
Posi(1) = 255

Qty.L = 1
For i = 1 To DimQty
  Qty * (Ubound(i - 1) + 1)
Next

Qty - 1

*Start= *x
For i = 0 To Qty
  St.s = ""
  For j = 1 To Random(511)
    PokeB(*Start, 65 + Random(25) )
    *Start + 1
  Next
  PokeB(*Start, 0)
  *Start + 1
Next


Index.L = (Ubound(0) + 1) * Posi(1) + Posi(0)
Count.L = 0

MessageRequester("a", "Test 1...")
t0 = ElapsedMilliseconds()
If Count < Index
  *Start = *x
  Repeat
    Valeur.B = PeekB(*Start)
    If Valeur = 0: Count + 1: EndIf
    *Start + 1
  Until Count = Index
EndIf
t1 = ElapsedMilliseconds()
St.S = ""
Repeat
  Valeur.B = PeekB(*Start)
  *Start + 1
  St + Chr(Valeur)
Until Valeur = 0
MessageRequester("a", "Recherche avec les instructions PB finie")
MessageRequester("a", "Test 2")
t2 = ElapsedMilliseconds()
*Start = *x
!mov ebx, dword [v_Index]
!xor edx, edx
!mov edi, dword [p_Start]
!cmp edx, ebx
!jz  l_finit
!xor eax, eax
!mov ecx, $7FFFFFFF
demarre:
!Repne scasb ; *** C'est véritablement LA seule instruction à bien connaître en ASM ***
!inc edx
!cmp edx, ebx
!jnz l_demarre
finit:
!mov dword [p_Start], edi
!mov dword [v_Count], edx
t3 = ElapsedMilliseconds()

MessageRequester("a", "Recherche avec les instructions ASM finie")
St2.S = ""
Repeat
  Valeur.B = PeekB(*Start)
  *Start + 1
  St2 + Chr(Valeur)
Until Valeur = 0
d1 = t1 - t0
d2 = t3 - t2
MessageRequester("Résumé", St + " (trouvée avec PB)" + Chr(10) + St2 + " (trouvée avec ASM)")
MessageRequester("Résumé", "Durée de la recherche en PB : " + Str(d1) + "ms" + Chr(10) + "Durée de la recherche en ASM : " + Str(d2) + "ms")

Publié : jeu. 16/août/2007 4:54
par Kwai chang caine
Ah bah la ......y'a pas fotomaton :D
Ce qui est fou c'est que PB converti en ASM.
Alors on se demande pourquoi une telle difference. 8O

Surement parce que le code généré automatiquement n'est pas optimizé :roll:

Mais dis donc tu dort jamais ?
Moi je vais y aller....Sinon, comment je pourrais faire pour dire autant de betises sur ce forum, si j'ai pas les idées claires :D

Mille merci de tes nombreuses démos
Bonne nuit

Publié : jeu. 16/août/2007 16:30
par Ollivier
Oui ton explication est juste : PB n'est pas optimisée.

La raison est qu'il vaut mieux un code fiable, notamment sur la gestion mémoire. Si on respecte rigoureusement les règles que Fred (et ceux qui l'ont aidé) préconise, PB 4.10 offre une excellente stabilité.

Comme disait Flype plus haut, pousser trop à tout faire en Assembleur, c'est risquer de rencontrer des bugs que PB permet d'éviter sans problème. C'est un gain de temps et de confort.

Cependant un petit bout de code ASM de quelques lignes inséré dans un programme répond à des besoins très objectifs (principalement la vitesse)
sur une étape précise.

Nota:
- PB est mode débogueur, il peut donc être plus rapide.

Publié : ven. 27/juin/2008 7:47
par graph100
je viens de relire le post et c'est juste pour information

les tableaux ne sont pas créés dans la mémoire RAM mais dans la mémoire virtuelle de window -> le fichier de pagination

Publié : sam. 28/juin/2008 3:11
par Ollivier
Oui, on ne sait pas exactement où se trouve une cellule mémoire en fait : elle peut être en RAM ou sur disque. C'est l'OS qui décide.

Quand on alloue un buffer (les tableaux y compris), la mémoire cache est sollicitée pour stocker le descripteurs de ce buffer.

Ce descripteur indique les infos du buffer : nombre de pages, taille, support (RAM ou HD), pointeurs, fréquence d'utilisation, seuils de transfert, etc...

Par exemple, le CPU mesure la fréquence d'utilisation des pages mémoire et renseigne l'OS. Si ce dernier estime que l'on utilise pas assez souvent une zone mémoire (buffer), il nous la glisse sur disque, sans que l'utilisateur ait eu fait le moindre contrôle.

C'est très souvent pratique, mais parfois, ça peut s'évérer contraignant...