J'ai remarqué des pb de preformance dans mon application VB/ADO/SQL Server,
j'ai observé que cela provient de la déclaration des tables. En effet le cas
n°1 (voir code ci-dessous) est plus lent que le cas n°2 (voir code
ci-dessous) et du N°3 (voir code ci-dessous).
Pourquoi ? Y-a-t-il une différence entre le cas numéro 2 et numéro 3 ? Que
choisir ?.
Cas n°1 : Pas de fermeture de la table avec : set TABLE = nothing
Dim BASE As ADODB.Connection
Set BASE = New ADODB.Connection
Dim TABLE1 As New ADODB.Recordset
Set TABLE1 = New ADODB.Recordset
Dim TABLE2 As New ADODB.Recordset
Set TABLE2 = New ADODB.Recordset
[ Traitement avec un open recordset ]
TABLE1.close
[ Traitement avec un open recordset ]
TABLE2.close
BASE .close
Set BASE = nothing
Cas n°2 : Fermeture de la table avec : set TABLE = nothing
Dim BASE As ADODB.Connection
Set BASE = New ADODB.Connection
Dim TABLE1 As New ADODB.Recordset
Set TABLE1 = New ADODB.Recordset
Dim TABLE2 As New ADODB.Recordset
Set TABLE2 = New ADODB.Recordset
[ Traitement avec un open recordset ]
TABLE.close
Set TABLE1 = nothing
[ Traitement avec un open recordset ]
TABLE2.close
Set TABLE2 = nothing
BASE .close
Set BASE = nothing
Cas n°3 : Pas de déclaration avec : set TABLE =
Dim BASE As ADODB.Connection
Set BASE = New ADODB.Connection
Dim TABLE1 As New ADODB.Recordset
Dim TABLE2 As New ADODB.Recordset
[ Traitement avec un open recordset ]
TABLE.close
[ Traitement avec un open recordset ]
TABLE2.close
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Zoury
Salut Daryl! :O)
j'ai observé que cela provient de la déclaration des tables. En effet le
cas
n°1 (voir code ci-dessous) est plus lent que le cas n°2 (voir code ci-dessous) et du N°3 (voir code ci-dessous).
Tu as observé ça de quelle manière? si tu n'as fait qu'exécuter les trois bouts de code les uns à la suite des autres, il m'apparaît normal que la première fois soit la plus lente.. Il y a peut-être une histoire de cache là dessous...
Pourquoi ? Y-a-t-il une différence entre le cas numéro 2 et numéro 3 ? Que choisir ?.
dans ce cas-ci, les trois temps d'exécution devrait être semblable sinon identique car dans les trois cas les objets sont placé à Nothing à la sortie de la fonction.. Les objets étant instanciés dans une fonction ou une sub sont libérés après celle-ci, s'ils sont instanciés au niveau d'un module, ils seront libérés à la fermeture du programme.. dans un cas semblable il est préférable de libéré explicitement ces objets.
lit aussi ce message concernant la déclaration de tes objets.. http://groups.google.com/groups?threadmæks%24bV4BHA.2816%40tkmsftngp05
Merci de poster les réponses au groupe afin d'en faire profiter à tous
Salut Daryl! :O)
j'ai observé que cela provient de la déclaration des tables. En effet le
cas
n°1 (voir code ci-dessous) est plus lent que le cas n°2 (voir code
ci-dessous) et du N°3 (voir code ci-dessous).
Tu as observé ça de quelle manière? si tu n'as fait qu'exécuter les trois
bouts de code les uns à la suite des autres, il m'apparaît normal que la
première fois soit la plus lente.. Il y a peut-être une histoire de cache là
dessous...
Pourquoi ? Y-a-t-il une différence entre le cas numéro 2 et numéro 3 ? Que
choisir ?.
dans ce cas-ci, les trois temps d'exécution devrait être semblable sinon
identique car dans les trois cas les objets sont placé à Nothing à la sortie
de la fonction.. Les objets étant instanciés dans une fonction ou une sub
sont libérés après celle-ci, s'ils sont instanciés au niveau d'un module,
ils seront libérés à la fermeture du programme.. dans un cas semblable il
est préférable de libéré explicitement ces objets.
lit aussi ce message concernant la déclaration de tes objets..
http://groups.google.com/groups?threadmæks%24bV4BHA.2816%40tkmsftngp05
j'ai observé que cela provient de la déclaration des tables. En effet le
cas
n°1 (voir code ci-dessous) est plus lent que le cas n°2 (voir code ci-dessous) et du N°3 (voir code ci-dessous).
Tu as observé ça de quelle manière? si tu n'as fait qu'exécuter les trois bouts de code les uns à la suite des autres, il m'apparaît normal que la première fois soit la plus lente.. Il y a peut-être une histoire de cache là dessous...
Pourquoi ? Y-a-t-il une différence entre le cas numéro 2 et numéro 3 ? Que choisir ?.
dans ce cas-ci, les trois temps d'exécution devrait être semblable sinon identique car dans les trois cas les objets sont placé à Nothing à la sortie de la fonction.. Les objets étant instanciés dans une fonction ou une sub sont libérés après celle-ci, s'ils sont instanciés au niveau d'un module, ils seront libérés à la fermeture du programme.. dans un cas semblable il est préférable de libéré explicitement ces objets.
lit aussi ce message concernant la déclaration de tes objets.. http://groups.google.com/groups?threadmæks%24bV4BHA.2816%40tkmsftngp05
Merci de poster les réponses au groupe afin d'en faire profiter à tous
jmn
Avec set truc= new ... la création de l'objet est réalisée de manière dynamique lors de l'exécution et tous les traitements associés à l'instanciation de l'objet sont faits à ce moment là.
Avec Dim truc as new... la référence à l'objet est résolue au moment de la compilation et une partie des traitements associés sont réalisés préalablement à l'exécution.
Par ailleurs, objet.close demande à l'objet de procéder à sa fermeture (ce qui entraine souvent des traitements spécifiques), alors que set objet = nothing supprimer purement et simplement la référence à l'objet (et les structures associées) de l'espace de travail (ce qui revient 'en gros' à libérer de la mémoire et des pointeurs, ce qui va très vite).
Avec set truc= new ... la création de l'objet est réalisée de manière
dynamique lors de l'exécution et tous les traitements associés à
l'instanciation de l'objet sont faits à ce moment là.
Avec Dim truc as new... la référence à l'objet est résolue au moment de la
compilation et une partie des traitements associés sont réalisés
préalablement à l'exécution.
Par ailleurs,
objet.close demande à l'objet de procéder à sa fermeture (ce qui entraine
souvent des traitements spécifiques),
alors que set objet = nothing supprimer purement et simplement la référence
à l'objet (et les structures associées) de l'espace de travail (ce qui
revient 'en gros' à libérer de la mémoire et des pointeurs, ce qui va très
vite).
Avec set truc= new ... la création de l'objet est réalisée de manière dynamique lors de l'exécution et tous les traitements associés à l'instanciation de l'objet sont faits à ce moment là.
Avec Dim truc as new... la référence à l'objet est résolue au moment de la compilation et une partie des traitements associés sont réalisés préalablement à l'exécution.
Par ailleurs, objet.close demande à l'objet de procéder à sa fermeture (ce qui entraine souvent des traitements spécifiques), alors que set objet = nothing supprimer purement et simplement la référence à l'objet (et les structures associées) de l'espace de travail (ce qui revient 'en gros' à libérer de la mémoire et des pointeurs, ce qui va très vite).
Daryl
Merci à tous.
Donc si j'ai bien compris, comme je ne souhaites pas garder en cache les recordsets, j'utilise le code "set matable=nothing" (après le close de ma table) pour libérer l'espace mémoire et je déclare uniquement ma table avec le code "dim matable As New ADODB.Recordset" ?
Merci
"jmn" a écrit dans le message de news:
Avec set truc= new ... la création de l'objet est réalisée de manière dynamique lors de l'exécution et tous les traitements associés à l'instanciation de l'objet sont faits à ce moment là.
Avec Dim truc as new... la référence à l'objet est résolue au moment de la compilation et une partie des traitements associés sont réalisés préalablement à l'exécution.
Par ailleurs, objet.close demande à l'objet de procéder à sa fermeture (ce qui entraine souvent des traitements spécifiques), alors que set objet = nothing supprimer purement et simplement la
référence
à l'objet (et les structures associées) de l'espace de travail (ce qui revient 'en gros' à libérer de la mémoire et des pointeurs, ce qui va très vite).
Merci à tous.
Donc si j'ai bien compris, comme je ne souhaites pas garder en cache les
recordsets, j'utilise le code "set matable=nothing" (après le close de ma
table) pour libérer l'espace mémoire et je déclare uniquement ma table avec
le code "dim matable As New ADODB.Recordset" ?
Merci
"jmn" <jmn@truc.com> a écrit dans le message de news:
OKZMOECuDHA.1060@TK2MSFTNGP12.phx.gbl...
Avec set truc= new ... la création de l'objet est réalisée de manière
dynamique lors de l'exécution et tous les traitements associés à
l'instanciation de l'objet sont faits à ce moment là.
Avec Dim truc as new... la référence à l'objet est résolue au moment de la
compilation et une partie des traitements associés sont réalisés
préalablement à l'exécution.
Par ailleurs,
objet.close demande à l'objet de procéder à sa fermeture (ce qui entraine
souvent des traitements spécifiques),
alors que set objet = nothing supprimer purement et simplement la
référence
à l'objet (et les structures associées) de l'espace de travail (ce qui
revient 'en gros' à libérer de la mémoire et des pointeurs, ce qui va très
vite).
Donc si j'ai bien compris, comme je ne souhaites pas garder en cache les recordsets, j'utilise le code "set matable=nothing" (après le close de ma table) pour libérer l'espace mémoire et je déclare uniquement ma table avec le code "dim matable As New ADODB.Recordset" ?
Merci
"jmn" a écrit dans le message de news:
Avec set truc= new ... la création de l'objet est réalisée de manière dynamique lors de l'exécution et tous les traitements associés à l'instanciation de l'objet sont faits à ce moment là.
Avec Dim truc as new... la référence à l'objet est résolue au moment de la compilation et une partie des traitements associés sont réalisés préalablement à l'exécution.
Par ailleurs, objet.close demande à l'objet de procéder à sa fermeture (ce qui entraine souvent des traitements spécifiques), alors que set objet = nothing supprimer purement et simplement la
référence
à l'objet (et les structures associées) de l'espace de travail (ce qui revient 'en gros' à libérer de la mémoire et des pointeurs, ce qui va très vite).
jmn
Au final, c'est a peu près ca, sinon qu'il ne s'agit pas de libérer des caches de recordsets ou des recordsets en cache, mais des instances d'objet qui gérent ces recordsets. Mais c'est un détail.
Au final, c'est a peu près ca, sinon qu'il ne s'agit pas de libérer des
caches de recordsets ou des recordsets en cache, mais des instances d'objet
qui gérent ces recordsets. Mais c'est un détail.
Au final, c'est a peu près ca, sinon qu'il ne s'agit pas de libérer des caches de recordsets ou des recordsets en cache, mais des instances d'objet qui gérent ces recordsets. Mais c'est un détail.
Daryl
Merci encore "jmn" a écrit dans le message de news:
Au final, c'est a peu près ca, sinon qu'il ne s'agit pas de libérer des caches de recordsets ou des recordsets en cache, mais des instances
d'objet
qui gérent ces recordsets. Mais c'est un détail.
Merci encore
"jmn" <jmn@truc.com> a écrit dans le message de news:
OCSRbXCuDHA.3536@tk2msftngp13.phx.gbl...
Au final, c'est a peu près ca, sinon qu'il ne s'agit pas de libérer des
caches de recordsets ou des recordsets en cache, mais des instances
Merci encore "jmn" a écrit dans le message de news:
Au final, c'est a peu près ca, sinon qu'il ne s'agit pas de libérer des caches de recordsets ou des recordsets en cache, mais des instances
d'objet
qui gérent ces recordsets. Mais c'est un détail.
Zoury
> Donc si j'ai bien compris, comme je ne souhaites pas garder en cache les recordsets, j'utilise le code "set matable=nothing" (après le close de ma table) pour libérer l'espace mémoire et je déclare uniquement ma table
avec
le code "dim matable As New ADODB.Recordset"
en fait le Set... = Nothing est inutile car VB le fait tout seul après la fonction.
Merci de poster les réponses au groupe afin d'en faire profiter à tous
> Donc si j'ai bien compris, comme je ne souhaites pas garder en cache les
recordsets,
j'utilise le code "set matable=nothing" (après le close de ma
table) pour libérer l'espace mémoire et je déclare uniquement ma table
avec
le code "dim matable As New ADODB.Recordset"
en fait le Set... = Nothing est inutile car VB le fait tout seul après la
fonction.
> Donc si j'ai bien compris, comme je ne souhaites pas garder en cache les recordsets, j'utilise le code "set matable=nothing" (après le close de ma table) pour libérer l'espace mémoire et je déclare uniquement ma table
avec
le code "dim matable As New ADODB.Recordset"
en fait le Set... = Nothing est inutile car VB le fait tout seul après la fonction.