PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 8 sept. 2006 à 13:32
salut,
eh beh Mortalino, t'es pas en forme ^^
renvoyer l'avant dernier.. beh vlà autre chose !!!
bref
affoufa -> non çà n'existe pas en tout fait.
attention à ta question. tu pourras savoir que 6 ets le plus grand, pas b. tu vois la différence?
ensuite ta question c'est sur 3 nombres, OU plus....
Private Sub Form_Load()
MsgBox ValMax(5, 6, 2)
End Sub
'
Function ValMax(a As Currency, b As Currency, c As Currency) As Currency
If (a >= b) And (a >= c) Then
ValMax = a
ElseIf b >= c Then
ValMax = b
Else
ValMax = c
End If
End Function
econs
Messages postés4030Date d'inscriptionmardi 13 mai 2003StatutMembreDernière intervention23 décembre 200825 8 sept. 2006 à 13:45
Je confirme, mortalino, là ... faut te reposer un peu
Voici une version qui renvoit le max quel que soit le nombre d'éléments (puisque tu demandais 3 ou plus). Les données doivent préalablement être mises dans un tableau.
Function ValMax(t() As Integer) As Integer
Dim maxVal As Integer
maxVal = t(LBound(t))
For i = LBound(t)+1 ToUbound(t)
If t(i) > maxVal Then
maxVal = t(i)
End If
Next i
ValMax = maxVal
End Function
Manu
--------------------------------------------------------------------------------------------
Avant de poster un message, n'oubliez pas de consulter le reglement.
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 8 sept. 2006 à 14:00
Autre version de la fonction de econs :
Public Function ValMax(ParamArray t()) As Integer
Dim maxVal As Integer
maxVal = t( LBound (t))
For i = LBound(t) + 1 To UBound(t)
If t(i) > maxVal Then
maxVal = t(i)
End If
Next i
ValMax = maxVal
End Function
Plus besoin de mettre tes valeurs dans un tableau, tu appele la fonction ainsi :
toto = ValMax(1, 5, 6, 8, 14, 3, 7, 12)
---- Sevyc64 (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
econs
Messages postés4030Date d'inscriptionmardi 13 mai 2003StatutMembreDernière intervention23 décembre 200825 8 sept. 2006 à 14:12
casy> Ah ouais, chouette aussi
Manu --------------------------------------------------------------------------------------------
Avant de poster un message, n'oubliez pas de consulter le reglement.
Public Function ValMax3(ParamArray t()) As Variant
'ne déclarons pas le Variant temporaire
For Each valTemp In t
ValMax3 = IIf(valTemp > ValMax3, valTemp, ValMax3)
Next valTemp
End Function
, pour un résultat presque identique (pas que sur les entiers),
Mais surtout, je propose une batterie de tests (déjà rédigée, juste copier/coller/tester), qui va peut-être ré-habiliter les Variant aux yeux de certains. Bien sûr, vous l'aurez compris, ce n'est qu'un jeu.
Cependant, ne sera pas forcément le gagnant celui qu'on croît.
Pour cela, créez un projet VB exe Standard, dans le formulaire Form1 de celui-ci, ajoutez un bouton de commande Command1, collez le code qui suit, exécutez le projet, en prenant soin d'afficher la fenêtre d'exécution immédiate (de debug quoi!), et sollicitez autant de fois que nécessaire le bouton Command1, jusqu'à ce que vous constatiez que les fonctions ne mettent pas autant de temps à s'exécuter.
Private Sub Command1_Click()
Dim sngDebut1 As Single, sngDebut2 As Single, sngDebut3 As Single
Dim sngFin1 As Single, sngFin2 As Single, sngFin3 As Single
Dim sngDuree1 As Single, sngDuree2 As Single, sngDuree3 As Single
Dim varMax As Variant, varClassement As Variant
'********************************************
'*** Max en dernier
'********************************************
Debug.Print
Debug.Print"30 arguments (de grandes valeurs), max en dernier"
sngDebut1 = Timer
varMax = ValMax(32000, 32001, 32001, 32003, 32004, 32005, 32006, 32007, 32008, 32009, 32010, 32011, 32012, 32013, 32014, 32015, 32016, 32017, 32018, 32019, 32020, 32021, 32022, 32023, 32024, 32025, 32026, 32027, 32028, 32029)
sngFin1 = Timer
Debug.Print "Classement :"
Debug.Print "1/" & vbTab & "2/" & vbTab & "3/"
varClassement = Classement(sngDuree1, sngDuree2, sngDuree3)
Debug.Print Join(varClassement, vbTab)
End If
End Sub
Public Function ValMax(ParamArray t()) As Integer
Dim maxVal As Integer
maxVal = t(LBound(t))
For i = LBound(t) + 1 To UBound(t)
If t(i) > maxVal Then
maxVal = t(i)
End If
Next i
ValMax = maxVal
End Function
Public Function ValMax2(ParamArray t()) As Variant
Dim valTemp As Variant
For Each valTemp In t
ValMax2 = IIf(valTemp > ValMax2, valTemp, ValMax2)
Next valTemp
End Function
Public Function ValMax3(ParamArray t()) As Variant
'ne déclarons pas le Variant temporaire
For Each valTemp In t
ValMax3 = IIf(valTemp > ValMax3, valTemp, ValMax3)
Next valTemp
End Function
'******************************************
'*** Outil, juste pour la démo
'******************************************
Public Function Classement(ParamArray t()) As Variant
Dim ClassementTemp() As Variant
ReDim ClassementTemp(LBound(t) To UBound(t))
i = 0
For Each valTemp In t
ClassementTemp(i) = 1
For Each valTemp2 In t
ClassementTemp(i) = IIf(valTemp > valTemp2, ClassementTemp(i) + 1, ClassementTemp(i))
Next valTemp2
i = i + 1
Next valTemp
Classement = ClassementTemp
End Function
Evidemment, c'est un peu démagogique de ma part, le ParamArray traitant des Variant, mais, quand on laisse parler la communauté, elle aboutit à des solutions ergonomique les utilisant (bien vu, Casy).
Allez, tous en coeur, Non à l'EuroMillion, Non...
espérant plus vous divertir que vous convertir
à+
rvblog<sup>n
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!</sup>
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 20 sept. 2006 à 12:00
C'est une plaisanterie j'espère !!!!
Comment peux-tu prétendre mesurer une durée d'exécution en utilisant Timer.
Pour info Timer a une résolution de 18ms (18.2 pour être exact), donc ta mesure sera à +/-18ms près. Et tout ce qui est en dessous de 18ms sera égal à 0
J'espère quand même que toutes les boucles mêmes les pires, fonctionnent toutes en dessous des 18ms, sinon ça devient grave.
Pour info, le type Variant est obsolète, il a disparu dans .NET
---- Sevyc64 (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 20 sept. 2006 à 12:12
Ca ne sert à rien de faire le test puisque les résultats seront de toute façon faussés.
Les durées seront inférieures à 18ms donc égales à 0 avec ton code. Sans même essayer le code, j'en déduit que tu trouve que les différentes façons de calculer se valent en temps d'exécution, forcement puisque tu n'arrive pas à les évaluées correctement.
---- Sevyc64 (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
rvblog
Messages postés792Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention12 juin 20127 20 sept. 2006 à 12:20
Grossière erreur,
je ne cherche pas à mesurer précisément le temps d'exécution de chacune, je cherche à détecter, quand l'une d'entre elles dépassent les 18ms (pardon 18,2), laquelle l'a fait (c'est pour cela que je demande de "solliciter" le bouton Command1 autant de fois que nécessaire).
Et ça arrive, et ce n'est pas forcément celle qu'on croit.
Par contre, j'avoue que s'il y a une vitesse d'exécution que je ne peux pas mesurer, c'est celle du temps qui va passer avant que tu fasse le test :)
Pardon, casy, si je t'ai agacé, ce n'était pas du tout le but.
PS : ça va peut-être le devenir (mais non, j'rigole, je ne fais de l'indus qu'à 45% de mon temps, mais je respecte ceux qui en font plus, je les lis [sur VBF], et je teste ce qu'ils font [sur VBF aussi])
rvblog<sup>n
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!</sup>
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 20 sept. 2006 à 12:39
J'ai fait le test, en modifiant ton code pour mesurer plus précisément. Et chez moi aucune ne dépasse 1ms même en solicitant énormément le bouton. J'ai juste la fenetre Debug qui a du mal à suivre quand je force trop.
Ce qui ne m'étonne pas vraiment. Il faudrait augmenter considérablement le nombre de valeur à tester pour commencer à avoir des mesures significatives.
---- Sevyc64 (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 20 sept. 2006 à 12:42
salut,
y'a pas de quoi se monter le bourichon ^^
voici la trace du test effectué avec QueryPerformanceCounter
<hr size= "2" width="100%" />30 arguments (de grandes valeurs), max en dernier
1/ ValMax : 0,1095
2/ ValMax2 : 0,0824
3/ ValMax3 : 0,0425
Classement :
1/ 2/ 3/
3 2 1
30 arguments (de grandes valeurs), max en premier
1/ ValMax : 0,0947
2/ ValMax2 : 0,0534
3/ ValMax3 : 0,0402
Classement :
1/ 2/ 3/
3 2 1
30 arguments (de grandes valeurs), max en dernier
1/ ValMax : 0,102
2/ ValMax2 : 0,0534
3/ ValMax3 : 0,0413
Classement :
1/ 2/ 3/
3 2 1
30 arguments (de grandes valeurs), max en premier
1/ ValMax : 0,5168
2/ ValMax2 : 0,074
3/ ValMax3 : 0,0425
Classement :
1/ 2/ 3/
3 2 1
30 arguments (de grandes valeurs), max en dernier
1/ ValMax : 0,0986
2/ ValMax2 : 0,0553
3/ ValMax3 : 0,0411
Classement :
1/ 2/ 3/
3 2 1
30 arguments (de grandes valeurs), max en premier
1/ ValMax : 0,0936
2/ ValMax2 : 0,0531
3/ ValMax3 : 0,0405
Classement :
1/ 2/ 3/
3 2 1
<hr size="2" width="100%" />
je vous vois arriver : "le code n'est pas compilé".... voyons çà (fichier log)
<hr size="2" width="100%" />[12:34:35] 30 arguments (de grandes valeurs), max en dernier
[12:34:35] 1/ ValMax : 0,1483
[12:34:35] 2/ ValMax2 : 1,1122
[12:34:35] 3/ ValMax3 : 0,0833
[12:34:35] Classement :
[12:34:35] 1/ 2/ 3/
[12:34:35] 2 3 1
[12:34:35]
[12:34:35] 30 arguments (de grandes valeurs), max en premier
[12:34:35] 1/ ValMax : 0,1081
[12:34:35] 2/ ValMax2 : 0,0478
[12:34:35] 3/ ValMax3 : 0,0372
[12:34:35] Classement :
[12:34:35] 1/ 2/ 3/
[12:34:35] 3 2 1
[12:34:35]
[12:34:35]
[12:34:35] 30 arguments (de grandes valeurs), max en dernier
[12:34:35] 1/ ValMax : 0,0902
[12:34:35] 2/ ValMax2 : 0,0481
[12:34:35] 3/ ValMax3 : 0,0369
[12:34:35] Classement :
[12:34:35] 1/ 2/ 3/
[12:34:35] 3 2 1
[12:34:35]
[12:34:35] 30 arguments (de grandes valeurs), max en premier
[12:34:35] 1/ ValMax : 0,0738
[12:34:35] 2/ ValMax2 : 0,0492
[12:34:35] 3/ ValMax3 : 0,0399
[12:34:35] Classement :
[12:34:35] 1/ 2/ 3/
[12:34:35] 3 2 1
[12:34:35]
[12:34:35]
[12:34:35] 30 arguments (de grandes valeurs), max en dernier
[12:34:35] 1/ ValMax : 0,0802
[12:34:35] 2/ ValMax2 : 0,0494
[12:34:35] 3/ ValMax3 : 0,0399
[12:34:35] Classement :
[12:34:35] 1/ 2/ 3/
[12:34:35] 3 2 1
[12:34:35]
[12:34:35] 30 arguments (de grandes valeurs), max en premier
[12:34:35] 1/ ValMax : 0,0813
[12:34:35] 2/ ValMax2 : 0,0489
[12:34:35] 3/ ValMax3 : 0,0405
[12:34:35] Classement :
[12:34:35] 1/ 2/ 3/
[12:34:35] 3 2 1
<hr size="2" width="100%" />
conclusion
compilé ou non, le tri de tableau est plus long que tri de variant....
le tris de variant s'équivalent avec ou sans déclaration (çà ne n'est pas un secret....)
encore faudrait-il aussi tester le For i au lieu de For Each et vice-versa, dans tous les cas.
seulement tout ceci ne prouve rien, on parle de des ressources prises par les Variant.
ces ressources sont en RAM et pas en cadence proc.
je veux bien, on préfèrera parfois une certaine rapidité (et c'est même en général le seul but recherché), maintenant le test devrait être fait sur un trableau de bien plus conséquent, et en déclarant toutes les variables (toujours ^^)
ps : temps exprimé en ms ^^
++
<hr size ="2" width="100%" />Prenez un instant pour répondre à ce sondage svp
quand tu dis temps exprimé en ms, tu veux dire ValMax : 0,0813ms?
et comment faites-vous pour mesurer de si petites durées?
quelle est la modif que tu fais casy ?
rvblog<sup>n
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!</sup>
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 20 sept. 2006 à 14:28
PCPT à utiliser l'API QueryPerformanceCounter, qui fait appel à un compteur système très precis (mais qui peut ne pas etre installé sur ta machine, ça dépend des cartes mères si mes souvenir). Precision en fonction de la machine mais largement inférieure à 1ms
Moi j'ai simplement remplacer Timer par GetTickCount, qui est une api qui renvoie le nombre de ms depuis le chargement de Windows. Precision de 1ms.
---- Sevyc64 (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
à savoir que de toute manière il est modifié en if else à la compilation (donc...).
bon, on ne peut pas rester si des tests si peu représentatifs....
j'ajoute 2 3 bricoles, c'est à dire au début du click un tableau de 60000 nombres, et les tests (espérons les révélateurs) se font sur des tableaux de variant (et non plus ParamArray)
çà donne en gros :
Function MoreNumbers() As Variant()
Dim i&, avRet(59999) As Variant
For i = 0 To 5999
avRet(i) = Fix(Rnd * 9999) + 1111)
Next i
MoreNumbers = avRet
Erase avRet
End Function
''''''''''''''''''''''
Public Function ValMax(t()) As Variant
une trace?
la différence (espace et temps) et IDE vs EXE
<hr size="2" width="100%" />[14:24:24] 60000 arguments (de grandes valeurs), max en dernier
[14:24:24] 1/ ValMax : 24,966
[14:24:24] 2/ ValMax2 : 49,8128
[14:24:24] 3/ ValMax3 : 102,434
[14:24:24] Classement :
[14:24:24] 1/ 2/ 3/
[14:24:24] 1 2 3
[14:24:24]
[14:24:24] 60000 arguments (de grandes valeurs), max en premier
[14:24:24] 1/ ValMax : 21,7922
[14:24:24] 2/ ValMax2 : 53,9608
[14:24:24] 3/ ValMax3 : 50,4941
[14:24:24] Classement :
[14:24:24] 1/ 2/ 3/
[14:24:24] 1 3 2
[14:24:25]
[14:24:25]
[14:24:25] 60000 arguments (de grandes valeurs), max en dernier
[14:24:25] 1/ ValMax : 20,6244
[14:24:25] 2/ ValMax2 : 71,6982
[14:24:25] 3/ ValMax3 : 59,8976
[14:24:25] Classement :
[14:24:25] 1/ 2/ 3/
[14:24:25] 1 3 2
[14:24:25]
[14:24:25] 60000 arguments (de grandes valeurs), max en premier
[14:24:25] 1/ ValMax : 19,277
[14:24:25] 2/ ValMax2 : 56,2736
[14:24:25] 3/ ValMax3 : 60,0006
[14:24:25] Classement :
[14:24:25] 1/ 2/ 3/
[14:24:25] 1 2 3
[14:24:25]
[14:24:25]
[14:24:25] 60000 arguments (de grandes valeurs), max en dernier
[14:24:25] 1/ ValMax : 20,1953
[14:24:25] 2/ ValMax2 : 52,7813
[14:24:25] 3/ ValMax3 : 57,5459
[14:24:25] Classement :
[14:24:25] 1/ 2/ 3/
[14:24:25] 1 2 3
[14:24:25]
[14:24:25] 60000 arguments (de grandes valeurs), max en premier
[14:24:25] 1/ ValMax : 24,0877
[14:24:25] 2/ ValMax2 : 59,1184
[14:24:25] 3/ ValMax3 : 50,2589
[14:24:25] Classement :
[14:24:25] 1/ 2/ 3/
[14:24:25] 1 3 2
[14:24:26]
[14:24:26]
[14:24:26] 60000 arguments (de grandes valeurs), max en dernier
[14:24:26] 1/ ValMax : 19,1854
[14:24:26] 2/ ValMax2 : 49,4529
[14:24:26] 3/ ValMax3 : 52,0589
[14:24:26] Classement :
[14:24:26] 1/ 2/ 3/
[14:24:26] 1 2 3
[14:24:26]
[14:24:26] 60000 arguments (de grandes valeurs), max en premier
[14:24:26] 1/ ValMax : 19,7031
[14:24:26] 2/ ValMax2 : 55,5051
[14:24:26] 3/ ValMax3 : 50,0768
[14:24:26] Classement :
[14:24:26] 1/ 2/ 3/
[14:24:26] 1 3 2
<hr size="2" width="100%" />[14:25:23] 60000 arguments (de grandes valeurs), max en dernier
[14:25:23] 1/ ValMax : 11,2855
[14:25:23] 2/ ValMax2 : 38,6493
[14:25:23] 3/ ValMax3 : 44,3394
[14:25:23] Classement :
[14:25:23] 1/ 2/ 3/
[14:25:23] 1 2 3
[14:25:23]
[14:25:23] 60000 arguments (de grandes valeurs), max en premier
[14:25:24] 1/ ValMax : 9,2956
[14:25:24] 2/ ValMax2 : 40,9113
[14:25:24] 3/ ValMax3 : 139,2903
[14:25:24] Classement :
[14:25:24] 1/ 2/ 3/
[14:25:24] 1 2 3
[14:25:24]
[14:25:24]
[14:25:24] 60000 arguments (de grandes valeurs), max en dernier
[14:25:24] 1/ ValMax : 8,3849
[14:25:24] 2/ ValMax2 : 43,2083
[14:25:24] 3/ ValMax3 : 91,4784
[14:25:24] Classement :
[14:25:24] 1/ 2/ 3/
[14:25:24] 1 2 3
[14:25:24]
[14:25:24] 60000 arguments (de grandes valeurs), max en premier
[14:25:24] 1/ ValMax : 9,6124
[14:25:24] 2/ ValMax2 : 43,515
[14:25:24] 3/ ValMax3 : 40,2135
[14:25:24] Classement :
[14:25:24] 1/ 2/ 3/
[14:25:24] 1 3 2
[14:25:24]
[14:25:24]
[14:25:24] 60000 arguments (de grandes valeurs), max en dernier
[14:25:24] 1/ ValMax : 8,8559
[14:25:24] 2/ ValMax2 : 39,4578
[14:25:25] 3/ ValMax3 : 39,2276
[14:25:25] Classement :
[14:25:25] 1/ 2/ 3/
[14:25:25] 1 3 2
[14:25:25]
[14:25:25] 60000 arguments (de grandes valeurs), max en premier
[14:25:25] 1/ ValMax : 16,4719
[14:25:25] 2/ ValMax2 : 124,6231
[14:25:25] 3/ ValMax3 : 46,9484
[14:25:25] Classement :
[14:25:25] 1/ 2/ 3/
[14:25:25] 1 3 2
<hr size="2" width="100%" />
testé aussi avec 6000 (10 fois moins), la différence est moins importante mais pas mal non plus
conclusion
la tri INTEGER prend entre de 3 et 15 fois moins de temps que le VARIANT (et moins de ressources par définition)
amusant ces petits tests ^^
ps : récup = encore un changement de signature?
++
<hr size="2" width="100%" />Prenez un instant pour répondre à ce sondage svp
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 20 sept. 2006 à 14:39
rvblog -> oui, 0,0813ms, donc moins de1ms. voir dans mes sources -> AfTimer (à passer en Bench, exemple fourni)
par contre en réalité c'est plus cours puisque le timer prend son propre temps, quoi qu'il em semble avoir joué comme il fallait....
casy -> je croyais aussi mais non (enfin presque), cette API est supportée par toutes les CM depuis plus de 10 ans. je fais d'ailleurs le test (inutilement) dans mon AfTimer
++
<hr size="2" width="100%" />Prenez un instant pour répondre à ce sondage svp