cs_Warny
Messages postés473Date d'inscriptionmercredi 7 août 2002StatutMembreDernière intervention10 juin 2015 28 nov. 2003 à 14:00
Salut,
Pour ta deuxième solution, évite de laisser gérer au vb la taille des tableaux, je m'explique
en non compilé, les tableaux sont gérés par les dll du vb, et provoquent une erreur en cas de dépassement de capacité
en compilé, ça ne marche pas pareil ! Tu peux activer ou désactiver une option de compilation qui active ou désactive cette erreur.
En plus, la gestion d'erreur prend du temps (c'est un test, c'est vrai que depuis le pentium ça va plus vite, mais quand même)
Teste donc toi même la taille du tableau pour savoir si tu dois le redimenssionner !!!
zoubi57
Messages postés10Date d'inscriptionjeudi 16 mai 2002StatutMembreDernière intervention17 octobre 2019 28 nov. 2003 à 13:16
Merci a tous pour la pertinence de vous observations.
mais je suis comme St Thomas... les resultats parlent d'eux meme
(Je n'ai pas essaye la compil)
Si la source vous interresse, elle est en dessous mais elle n'est pas commentee.
Un merci special a Warny pour son Chr$ du quick Basic. je prepare un autre test pour verif in visu.
----------------------------
Tableau de 100000 elements.
Variant byref pas ReDim 1000 = 0,25
Variant byref pas ReDim 900 = 0,281
Variant byref pas ReDim 800 = 0,281
Variant byref pas ReDim 700 = 0,313
Variant byref pas ReDim 600 = 0,359
Variant byref pas ReDim 500 = 0,344
Variant byref pas ReDim 400 = 0,406
Variant byref pas ReDim 300 = 0,485
Variant byref pas ReDim 200 = 0,609
Variant byref pas ReDim 100 = 0,797
Static String Byref = 0,187
Static Variant Byref =0,203
LA SOURCE :
Option Explicit
Const INDEX_INCONNU As Long = 100000
Dim Debut As Double, Pas As Long, Temps As Double
Dim J As Long, I As Long
Private Type StructArray
Dynamic() As String
End Type
Dim Arrays(1 To 10) As StructArray
Dim TblStatic(INDEX_INCONNU) As String
Dim TblStatic2(INDEX_INCONNU) As String
Private Sub Form_Load()
Debug.Print "----------------------------"
Debug.Print "Tableau de " + Str$(INDEX_INCONNU) + " elements."
'pour etre sur que le pas ne depend pas de l'ordre d'affectation
For I = 10 To 1 Step -1
Pas = Abs(100 * I)
CallVariant Arrays(I).Dynamic
Debug.Print "Variant byref pas ReDim" + _
Str$(Pas) + " = " + Format$(Temps, "0.###")
Next I
CallStaticVariantByref TblStatic2
Debug.Print "Static Variant Byref =" + Format$(Temps, "0.###")
End
End Sub
Sub CallVariant(Tableu As Variant)
On Local Error GoTo ErrHandel
ReDim Preserve Tableu(Pas)
Debut = Timer
For J = 0 To INDEX_INCONNU
Tableu(J) = Str$(J)
Next J
Temps = Timer - Debut
Exit Sub
ErrHandel:
If Err.Number = 9 Then
ReDim Preserve Tableu(UBound(Tableu) + Pas)
Resume
End If
End Sub
Sub CallStaticStringByref(Tableu() As String)
Debut = Timer
For J = 0 To INDEX_INCONNU
Tableu(J) = Str$(J)
Next J
Temps = Timer - Debut
Exit Sub
End Sub
Sub CallStaticVariantByref(Tableu As Variant)
Debut = Timer
For J = 0 To INDEX_INCONNU
Tableu(J) = Str$(J)
Next J
Temps = Timer - Debut
Exit Sub
End Sub
Saros
Messages postés921Date d'inscriptionvendredi 20 décembre 2002StatutMembreDernière intervention23 septembre 2010 26 nov. 2003 à 21:47
Une optimisation possible serait de rajouter 10 cases toutes les 10 itérations (voire même plus) et de bien redimensionner le tableau à la fin.
Pour le type, c'est vrai que Variant laisse à désirer....
6/10
Saros
cs_Warny
Messages postés473Date d'inscriptionmercredi 7 août 2002StatutMembreDernière intervention10 juin 2015 26 nov. 2003 à 08:51
La redéfinition et le redimensionnement de variables est une opération assez gourmande en temps. Ton programme souffre donc de deux défauts :
- Même si tu ne connais pas à l'avance la taille de ton tableau, si tu utilise plusieurs itérations pour le dimensionner, définit une taille assez grande, puis réduit la en fin de traitement.
- Les variants ne sont pas typés par défaut. Avant leur utilisation, un typecast implicite est quasiment toujours effectué. Or celui-ci est très gourmand en temps. (PS pour EBArtSoft dans le même esprit il faut utliser Chr$ plutot que Chr, cher vieux basic quand tu nous tiens)
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 25 nov. 2003 à 23:39
Je vois pas ou est le mystere avec les tableaux ?
pour passer un tableau rien de plus simple :
dim MonTableau() as string
sub FuncAvecTbl(byref Tableu() as string )
rem Ya plus qu'a
end sub
du plus "'un tableau de string n'est pas de type string" est une
phrase qui ne veus pas dire grand chose mais si c'est ta
philosophie alors...
sinons c'est pas la peine de redimentionner ton tableau
a chaque cycle de ta boucle si tu connais a l'avance le nombre de cycle
fait seulement :
28 nov. 2003 à 14:00
Pour ta deuxième solution, évite de laisser gérer au vb la taille des tableaux, je m'explique
en non compilé, les tableaux sont gérés par les dll du vb, et provoquent une erreur en cas de dépassement de capacité
en compilé, ça ne marche pas pareil ! Tu peux activer ou désactiver une option de compilation qui active ou désactive cette erreur.
En plus, la gestion d'erreur prend du temps (c'est un test, c'est vrai que depuis le pentium ça va plus vite, mais quand même)
Teste donc toi même la taille du tableau pour savoir si tu dois le redimenssionner !!!
28 nov. 2003 à 13:16
mais je suis comme St Thomas... les resultats parlent d'eux meme
(Je n'ai pas essaye la compil)
Si la source vous interresse, elle est en dessous mais elle n'est pas commentee.
Un merci special a Warny pour son Chr$ du quick Basic. je prepare un autre test pour verif in visu.
----------------------------
Tableau de 100000 elements.
Variant byref pas ReDim 1000 = 0,25
Variant byref pas ReDim 900 = 0,281
Variant byref pas ReDim 800 = 0,281
Variant byref pas ReDim 700 = 0,313
Variant byref pas ReDim 600 = 0,359
Variant byref pas ReDim 500 = 0,344
Variant byref pas ReDim 400 = 0,406
Variant byref pas ReDim 300 = 0,485
Variant byref pas ReDim 200 = 0,609
Variant byref pas ReDim 100 = 0,797
Static String Byref = 0,187
Static Variant Byref =0,203
LA SOURCE :
Option Explicit
Const INDEX_INCONNU As Long = 100000
Dim Debut As Double, Pas As Long, Temps As Double
Dim J As Long, I As Long
Private Type StructArray
Dynamic() As String
End Type
Dim Arrays(1 To 10) As StructArray
Dim TblStatic(INDEX_INCONNU) As String
Dim TblStatic2(INDEX_INCONNU) As String
Private Sub Form_Load()
Debug.Print "----------------------------"
Debug.Print "Tableau de " + Str$(INDEX_INCONNU) + " elements."
'pour etre sur que le pas ne depend pas de l'ordre d'affectation
For I = 10 To 1 Step -1
Pas = Abs(100 * I)
CallVariant Arrays(I).Dynamic
Debug.Print "Variant byref pas ReDim" + _
Str$(Pas) + " = " + Format$(Temps, "0.###")
Next I
CallStaticStringByref TblStatic
Debug.Print "Static String Byref = " + Format$(Temps, "0.###")
CallStaticVariantByref TblStatic2
Debug.Print "Static Variant Byref =" + Format$(Temps, "0.###")
End
End Sub
Sub CallVariant(Tableu As Variant)
On Local Error GoTo ErrHandel
ReDim Preserve Tableu(Pas)
Debut = Timer
For J = 0 To INDEX_INCONNU
Tableu(J) = Str$(J)
Next J
Temps = Timer - Debut
Exit Sub
ErrHandel:
If Err.Number = 9 Then
ReDim Preserve Tableu(UBound(Tableu) + Pas)
Resume
End If
End Sub
Sub CallStaticStringByref(Tableu() As String)
Debut = Timer
For J = 0 To INDEX_INCONNU
Tableu(J) = Str$(J)
Next J
Temps = Timer - Debut
Exit Sub
End Sub
Sub CallStaticVariantByref(Tableu As Variant)
Debut = Timer
For J = 0 To INDEX_INCONNU
Tableu(J) = Str$(J)
Next J
Temps = Timer - Debut
Exit Sub
End Sub
26 nov. 2003 à 21:47
Pour le type, c'est vrai que Variant laisse à désirer....
6/10
Saros
26 nov. 2003 à 08:51
- Même si tu ne connais pas à l'avance la taille de ton tableau, si tu utilise plusieurs itérations pour le dimensionner, définit une taille assez grande, puis réduit la en fin de traitement.
- Les variants ne sont pas typés par défaut. Avant leur utilisation, un typecast implicite est quasiment toujours effectué. Or celui-ci est très gourmand en temps. (PS pour EBArtSoft dans le même esprit il faut utliser Chr$ plutot que Chr, cher vieux basic quand tu nous tiens)
25 nov. 2003 à 23:39
pour passer un tableau rien de plus simple :
dim MonTableau() as string
sub FuncAvecTbl(byref Tableu() as string )
rem Ya plus qu'a
end sub
du plus "'un tableau de string n'est pas de type string" est une
phrase qui ne veus pas dire grand chose mais si c'est ta
philosophie alors...
sinons c'est pas la peine de redimentionner ton tableau
a chaque cycle de ta boucle si tu connais a l'avance le nombre de cycle
fait seulement :
redim mon tableau(10)
for i=0 to 10
'....
next
et on peut faire de meme pour le asc()
a=asc("A")
for i=0 to 10
Tbl(i)=chr(a+i)
next
It is so simple... lol
@+