Comment connaitre le nombre d'élément d'un tableau [Résolu]
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!
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!
- Kwai chang caine
- Messages : 6989
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
Merci mon bon FLYPATOR de toutes ces précisions.
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.

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.

- Kwai chang caine
- Messages : 6989
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
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.
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.
- Kwai chang caine
- Messages : 6989
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
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")
- Kwai chang caine
- Messages : 6989
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
Ah bah la ......y'a pas fotomaton
Ce qui est fou c'est que PB converti en ASM.
Alors on se demande pourquoi une telle difference.
Surement parce que le code généré automatiquement n'est pas optimizé
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
Mille merci de tes nombreuses démos
Bonne nuit

Ce qui est fou c'est que PB converti en ASM.
Alors on se demande pourquoi une telle difference.

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

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

Mille merci de tes nombreuses démos
Bonne nuit
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.
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.
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...
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...