PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Meilleure performance tableau ou source de donnees?
Meilleure performance tableau ou source de donnees?
Débuté par orethore, 21 nov. 2005 17:56 - 7 réponses
Posté le 21 novembre 2005 - 17:56
Dans un programme j'ai une liste d'entiers tous differents que j'enrichie au cours de mon algorythme. A chaque boucle je verifie que l'entier que je traite existe ou pas dans la liste et si il n'existe pas je le stocke eventuellement dans la liste selon d'autres criteres. Les entiers ne peuvent malheureusement pas traites dans un ordre croissant ou decroissant (c'est aleatoire).

Quelle est la meilleure methode pour stocker cette liste d'entier afin de rendre les operation de stockage et de recherche la plus rapide possible
- un tableau (sachant que dans TableauCherche je pourrais utiliser que tcLinéaire a moins de le trier avant la recherche et utiliser tcDichotomique )
- une source de donnees dans laquelle je stockerai cet entier comme cle unique et utiliserai hlitrecherchepremier

Le nombre d'entiers peut etre egal a 100000, le traitement hors recherche prend 6heures... d'ou la question

Merci de votre aide
Posté le 22 novembre 2005 - 08:48
salut

je savais pas qu'on pouvait indexer une source de données

le tableau c'est pas mal, mieux que les zones mémoires.
on peut faire aussi une table invisible mais c'est quasiment pareil
Posté le 22 novembre 2005 - 09:56
je pense que dans ton traitement ce ne sont pas les fonctions tableau... qui
vont bcp te ralentir,
je doute qu'un tableaucherche sur 100000 entiers soit long !
tiens nous au courant de test résutats !

bon courage !
eric l

"olivier rethore" <orethore@rochester.rr.com> a écrit dans le message de
news: 4381f60c$1@news.pcsoft.fr...

Dans un programme j'ai une liste d'entiers tous differents que j'enrichie
au cours de mon algorythme. A chaque boucle je verifie que l'entier que je
traite existe ou pas dans la liste et si il n'existe pas je le stocke
eventuellement dans la liste selon d'autres criteres. Les entiers ne
peuvent malheureusement pas traites dans un ordre croissant ou decroissant
(c'est aleatoire).

Quelle est la meilleure methode pour stocker cette liste d'entier afin de
rendre les operation de stockage et de recherche la plus rapide possible
- un tableau (sachant que dans TableauCherche je pourrais utiliser que
tcLinéaire a moins de le trier avant la recherche et utiliser
tcDichotomique )
- une source de donnees dans laquelle je stockerai cet entier comme cle
unique et utiliserai hlitrecherchepremier

Le nombre d'entiers peut etre egal a 100000, le traitement hors recherche
prend 6heures... d'ou la question

Merci de votre aide


Posté le 22 novembre 2005 - 10:37
Ca depend:

Est-ce que tu peux connaitre au moment de la création du tableau combien d'éléments il devra contenir? Ca me parait être un point très important.

Méfiez-vous tout de même des tableaux dynamiques...
Et si on veut de la recherche dichotomique, faudra souvent trier le tableau en cas d'ajout intempestif!
Le problème qu'on a avec ce genre de question c'est qu'on ne sait pas exactement comment windev gère les tableaux dynamiques.
Si on ajoute plusieurs fois de suite des éléments dans un tableau dynamique, est-ce que la capacité du tableau augmente juste d'une unité à la fois? Ou est-ce que ça augmente avec un pas de 5, 10 ou 20?
Parce que si ca augmente une unité à la fois, faut chaque fois réallouer tout le tableau...

Le problème c'est qu'on a pas ce genre de transparence dans l'aide.
Posté le 22 novembre 2005 - 11:12
Salut

Utilise le profiler et tu auras ta réponse.

--

Ciao
Pat Biker
http://aaa.windev.free.fr/


On Mon, 21 Nov 2005 16:56:58 +0100, "olivier rethore"
<orethore@rochester.rr.com> wrote:


Dans un programme j'ai une liste d'entiers tous differents que j'enrichie au cours de mon algorythme. A chaque boucle je verifie que l'entier que je traite existe ou pas dans la liste et si il n'existe pas je le stocke eventuellement dans la liste selon d'autres criteres. Les entiers ne peuvent malheureusement pas traites dans un ordre croissant ou decroissant (c'est aleatoire).

Quelle est la meilleure methode pour stocker cette liste d'entier afin de rendre les operation de stockage et de recherche la plus rapide possible
- un tableau (sachant que dans TableauCherche je pourrais utiliser que tcLinéaire a moins de le trier avant la recherche et utiliser tcDichotomique )
- une source de donnees dans laquelle je stockerai cet entier comme cle unique et utiliserai hlitrecherchepremier

Le nombre d'entiers peut etre egal a 100000, le traitement hors recherche prend 6heures... d'ou la question

Merci de votre aide

Posté le 22 novembre 2005 - 12:51
exact...!
cependant dans l'api il existe une fonction pour réallouer un buffer :
utilisation de la place
libre en ram derrière la première allocation (avec déplacement en ram du
buffer
si nécessaire)...

http://msdn.microsoft.com/library/default.asp…

cette fonction peut retourner un erreur mais elle marche quasi tout le temps
ca permet
de gagner du temps
je ne sais pas comment WD gère ses allocations bien sûr...

mais effectivement si les éléments peuvent alloués par 5, 10 ou n c'est
encore mieux
pour ce genre d'utilisation ;)

eric l.

"Stef" <guest@newsgroup.fr> a écrit dans le message de news:
4382e074$1@news.pcsoft.fr...

Ca depend:

Est-ce que tu peux connaitre au moment de la création du tableau combien
d'éléments il devra contenir? Ca me parait être un point très important.

Méfiez-vous tout de même des tableaux dynamiques...
Et si on veut de la recherche dichotomique, faudra souvent trier le
tableau en cas d'ajout intempestif!
Le problème qu'on a avec ce genre de question c'est qu'on ne sait pas
exactement comment windev gère les tableaux dynamiques.
Si on ajoute plusieurs fois de suite des éléments dans un tableau
dynamique, est-ce que la capacité du tableau augmente juste d'une unité à
la fois? Ou est-ce que ça augmente avec un pas de 5, 10 ou 20?
Parce que si ca augmente une unité à la fois, faut chaque fois réallouer
tout le tableau...

Le problème c'est qu'on a pas ce genre de transparence dans l'aide.
Posté le 22 novembre 2005 - 18:09
Merci a tous pour vos avis. Je vais profiter de cette fin de semaine pour tester differents scenarios et vous donnerai un resume la semaine prochaine.
Posté le 23 novembre 2005 - 14:58
Avec toutes vos recommendations voici les conclusions des tests:
j'ai bien sur utilise l'analyseur de performance et le gestionnaire de tache de window
1 - il semble que WD gere correctement les tableaux dynamiques:
* les recherches sont tres rapides (moyenne 47microsecondes pour 200000 entiers
dans le tableau)
* l'ajout est rapide: 11 microsecondes
* l'allocation de memoire semble se faire correctement: il n'y a pas d'augmentation
sensible de la memoire durant le process de chargement du tableau.
2 - l'acces a une source fichier en lecture est rapide mais moins performant que les tableaux:
Pour une source de 11000 enregistrements de 50 octets
* HFiltre 19 microsecondes
* HlitPremier 132 microsecondes mais HLitSuivant 27 microsecondes
3 - WD ne sait pas gerer correctement les ajouts dans une source fichier. Le probleme de
reallocation n'est pas traite et la memoire utilisee ne cesse d'augmenter jusqu'a
un plantage memoire.

En clair ne jamais utiliser les sources pour creer des enregistrements mais seulement
les consulter.

Autre chose que j'ai decouvert sur les filtres appliques sur les sources fichiers.
Le Hlitpremier suivant:
condition=rubrique+"="+valeur
cledeparcours=HFiltre(source,condition)
Hlitpremier(source,cledeparcours)
est 50 a 100 fois plus long que celui-ci:
hfiltre(source,rubrique,valeur,valeur)
Hlitpremier(source,rubrique)

Il semble que l'optimisation de soit pas active dans les sources fichier.

A+