cs_asimengo
Messages postés280Date d'inscriptionjeudi 24 mars 2005StatutMembreDernière intervention18 mars 2009 5 sept. 2007 à 15:26
@BOUV: Question de gout?, humm je dirais y'a même pas photo, hé ben faut pas dire des bétises.
bouv
Messages postés1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 5 sept. 2007 à 14:41
ASIMENGO>>Je crois que c'est une question de goût tout ça. Chacun ses préférences. Perso je préfère le code de PCPT pour les raisons suivantes :
- Plus concis
- Ne passe pas par la variable Ui ce qui peut faire gagner quelques précieux cycles.
++
Bouv
cs_asimengo
Messages postés280Date d'inscriptionjeudi 24 mars 2005StatutMembreDernière intervention18 mars 2009 5 sept. 2007 à 14:05
@PCPT: je trouve toujours un peu lourd d'écrire des codes du genre de ta méthode rapide. L'utilisation des suites facilitent grandement la compréhension et même accélère également l'exécution. Je sais que c'était juste pour faire un aperçu mais c'est quand même pas une bonne habitude pour ceux qui lisent ça.
Voila, je la réecris comme il se doit.
Sub methode_rapide(ByRef r As String)
Dim i As Long, iLen As Integer, Ui as long
iLen = Len(a(LB))
r = String(((UB - LB + 1) * iLen), " ")
Ui=1: Mid$(r, Ui, iLen) = a(LB)
For i = LB +1 To UB
Ui=Ui+iLen: Mid$(r, Ui,iLen) = a(i)
Next i
End Sub
C'est bien pour compréhensible et surtout plus rapide.
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 4 sept. 2007 à 21:58
* échelle en seconde mais c'est pareil... ;)
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 4 sept. 2007 à 21:53
c'est le même principe avec des variables.
il est plus rapide d'écrire dans une allocation créée que de redimensionner à chaque écriture
voici un exemple plus ou moins comparable (principe pour les variables)
Option Explicit
Const LB As Integer = 1000
Const UB As Integer = 9000
Dim a(LB To UB) As String 'contiendra 4 caractères par item
Private Sub Form_Load()
Dim i As Long, t As Currency
' rempli le tableau
For i = LB To UB
a(i) = CStr(i)
Next i
' méthode longue
Dim r1 As String
t = Timer
Call methode_longue(r1)
Debug.Print "1> TEMPS : " & Timer - t & " ms"
DoEvents
' méthode rapide, en utilisant l'emplacement créé
Dim r2 As String
t = Timer
Call methode_rapide(r2)
Debug.Print "2> TEMPS : " & Timer - t & " ms"
Unload Me
End Sub
Sub methode_longue(ByRef r As String)
Dim i As Long
r = vbNullString
For i = LB To UB
r = r & a(i)
Next i
End Sub
Sub methode_rapide(ByRef r As String)
Dim i As Long, iLen As Integer
iLen = Len(a(LB))
r = String(((UB - LB + 1) * iLen), " ")
For i = LB To UB
Mid$(r, ((((i - LB) + 1) * iLen) + 1 - iLen), iLen) = a(i)
Next i
End Sub
++ ;)
Chatbour
Messages postés71Date d'inscriptionjeudi 27 juillet 2006StatutMembreDernière intervention12 juillet 200910 4 sept. 2007 à 21:40
Merci chef !
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 4 sept. 2007 à 21:20
Suppression physique des places non occupées, se fait par réécriture complète.
Chatbour
Messages postés71Date d'inscriptionjeudi 27 juillet 2006StatutMembreDernière intervention12 juillet 200910 4 sept. 2007 à 21:16
Merci pour les informations, mais je ne pige pas encore la tâche du compactage de la base de donnée :-/
bouv
Messages postés1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 4 sept. 2007 à 20:37
J'allais le dire...
Non je déconne mais c'est un bon résumé.
Peut être déjà un peu trop technique pour les néophytes mais faut bien progresser ;-)
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 4 sept. 2007 à 20:13
Vaste sujet...
espace gaspillé, on va voir que ça dépend du point de vue, place disque ou performances.
Une BDD est faite pour croitre donc elle ne fait que marquer 'libres' les lignes supprimées mais ne resserre jamais les fichiers de données (suppression physique) par un appel SetEndOfFile(). Il est moins couteux (en perfs) d'écrire sur une place déjà attribuée sur le disque (réécriture) plutot qu'une écriture nouvelle car oblige le driver fichier à trouver des clusters libres, si non contigus il faut à chaque morceau écrire aussi le pointeur sur le prochain cluster.
Résumé rapide mais c'est le principe.
Chatbour
Messages postés71Date d'inscriptionjeudi 27 juillet 2006StatutMembreDernière intervention12 juillet 200910 4 sept. 2007 à 19:55
Merci pour la source :)
en quoi consiste le compactage d'une base de donnée ?
c'est peut être éliminer l'espace gaspillé ?
5 sept. 2007 à 19:12
5 sept. 2007 à 18:57
le problème ne se serait pas posé si j'avais commencé le tableau à 1 en mettant "data_bidon" en boucle dans le load.
ce qui est important ici est évidemment le principe! en l'uccorence l'utilisation de mid dans l'espace déjà créé.
du reste on s'aperçoit au moins que malgré le manque d'optimisation de l'exemple, la différence des 2 méthode reste énorme ;)
bref pour une base çà nous rapelle donc le compromis qu'il peut falloir faire entre taille (de la base) et rapidité (d'écriture)
++ ;)
5 sept. 2007 à 18:17
devrait normalement couter 1 cycle, absolument imbattable.
((((i - LB) + 1) * iLen) + 1 - iLen)
ici approximativement 12 cycles.
5 sept. 2007 à 15:26
5 sept. 2007 à 14:41
- Plus concis
- Ne passe pas par la variable Ui ce qui peut faire gagner quelques précieux cycles.
++
Bouv
5 sept. 2007 à 14:05
Voila, je la réecris comme il se doit.
Sub methode_rapide(ByRef r As String)
Dim i As Long, iLen As Integer, Ui as long
iLen = Len(a(LB))
r = String(((UB - LB + 1) * iLen), " ")
Ui=1: Mid$(r, Ui, iLen) = a(LB)
For i = LB +1 To UB
Ui=Ui+iLen: Mid$(r, Ui,iLen) = a(i)
Next i
End Sub
C'est bien pour compréhensible et surtout plus rapide.
4 sept. 2007 à 21:58
4 sept. 2007 à 21:53
il est plus rapide d'écrire dans une allocation créée que de redimensionner à chaque écriture
voici un exemple plus ou moins comparable (principe pour les variables)
Option Explicit
Const LB As Integer = 1000
Const UB As Integer = 9000
Dim a(LB To UB) As String 'contiendra 4 caractères par item
Private Sub Form_Load()
Dim i As Long, t As Currency
' rempli le tableau
For i = LB To UB
a(i) = CStr(i)
Next i
' méthode longue
Dim r1 As String
t = Timer
Call methode_longue(r1)
Debug.Print "1> TEMPS : " & Timer - t & " ms"
DoEvents
' méthode rapide, en utilisant l'emplacement créé
Dim r2 As String
t = Timer
Call methode_rapide(r2)
Debug.Print "2> TEMPS : " & Timer - t & " ms"
Unload Me
End Sub
Sub methode_longue(ByRef r As String)
Dim i As Long
r = vbNullString
For i = LB To UB
r = r & a(i)
Next i
End Sub
Sub methode_rapide(ByRef r As String)
Dim i As Long, iLen As Integer
iLen = Len(a(LB))
r = String(((UB - LB + 1) * iLen), " ")
For i = LB To UB
Mid$(r, ((((i - LB) + 1) * iLen) + 1 - iLen), iLen) = a(i)
Next i
End Sub
++ ;)
4 sept. 2007 à 21:40
4 sept. 2007 à 21:20
4 sept. 2007 à 21:16
4 sept. 2007 à 20:37
Non je déconne mais c'est un bon résumé.
Peut être déjà un peu trop technique pour les néophytes mais faut bien progresser ;-)
4 sept. 2007 à 20:13
espace gaspillé, on va voir que ça dépend du point de vue, place disque ou performances.
Une BDD est faite pour croitre donc elle ne fait que marquer 'libres' les lignes supprimées mais ne resserre jamais les fichiers de données (suppression physique) par un appel SetEndOfFile(). Il est moins couteux (en perfs) d'écrire sur une place déjà attribuée sur le disque (réécriture) plutot qu'une écriture nouvelle car oblige le driver fichier à trouver des clusters libres, si non contigus il faut à chaque morceau écrire aussi le pointeur sur le prochain cluster.
Résumé rapide mais c'est le principe.
4 sept. 2007 à 19:55
en quoi consiste le compactage d'une base de donnée ?
c'est peut être éliminer l'espace gaspillé ?