π
<-

Optimisation et gestion des listes sur Nspire

Pour le TI-Basic sur Nspire

Optimisation et gestion des listes sur Nspire

Unread postby Levak » 17 Mar 2011, 14:20

Bonjour à tous,
Je vous présente aujourd'hui les résultats d'une démarche expérimentale que j'ai réalisée sur des optimisations possibles de vos programmes utilisant intensément les listes (Comme Make3D pour ma part).

Déjà, tout le monde l'aura remarqué, la gestion des listes sur Nspire est horrible; rajouter un élément demande un temps quadratiquement proportionnel au nombre d'éléments déjà présents dans la liste. Pourtant cela n'est pas anodin.

Dans un premier temps j'ai alors réalisé un mini gestionnaire de mémoire virtuelle totalement en TI-Basic afin de voir si la gestion des listes foireuse était due à un mauvais code. Après plusieurs benchs, il s'est avéré que l'ajout d'éléments était beaucoup plus rapide (création d'un nouveau bloc, assignation de la valeur), mais la suppression, elle demandait un temps supplémentaire non négligeable. Si on compte création puis suppression, les benchs de ma mémoire virtuelle équivalaient à ceux des fonctions préconçues. Ce test est important pour comprendre la conclusion.

Quelques mois se sont écoulés, j'ai acquis de nouvelles connaissances algorithmiques, notamment sur la gestion de blocs dynamiques et listes chaînées. En effet si les listes implémentées étaient dynamiques l'accès à un Ieme élément serait beaucoup plus long. Etant donné que je n'ai pas réalisé de benchs convainquant sur l'accès des éléments, car de durée infime, cela ne prouvait rien. En effet, en structure dynamique, ajouter un élément en fin nécessite de parcourir toute la liste.

C'est donc là que j'ai pensé à un petit test avec la fonction augment(list, list).

Ajout en fin (durée : 15 secondes):
l:={}:for i, 1, 1000:l:=augment(l, {i}):Endfor:1

En tête (durée : 15 secondes):
l:={}:for i, 1, 1000:l:=augment({i}, l):Endfor:1

Fort est-il de constater que ce n'est pas une structure dynamique étant donné que la concaténation de deux listes ne dépend pas de la longueur de la 1ere.
La seule possibilité est donc l'inverse de la structure dynamique, c'est donc la structure statique où les éléments de la liste sont contigus dans la mémoire donnant un accès et des modifications rapides. Ainsi, on comprend la lenteur de la fonction augment(). A chaque appel de cette fonction, la Nspire va recréer un tableau de longueur X+Y en y recopiant chaque valeur de la liste X et de la liste Y.

La solution est donc, comme en C, de connaître la taille finale de la liste pour l'initialiser uniquement au début.

l:=newList(1000):for i, 1, 1000:l[i] = i:Endfor:1

prend 5 secondes contre 15 auparavant.


edit pour Bisam.
Responsable design/graphique de TI-Planet
I do not get mad at people, I just want them to learn the way I learnt.
ImageTNOC [topic][DL]
nClock [topic][DL]
HideManager [topic][DL]
ZLock [topic][DL]
Theme Editor [topic][DL]
Mes programmes
User avatar
LevakAdmin
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 98.9%
 
Posts: 6414
Images: 22
Joined: 27 Nov 2008, 00:00
Location: 0x1AACC355
Gender: Male
Calculator(s):
MyCalcs profile
Class: BAC+5: Epita (ING3)

Re: Optimisation et gestion des listes sur Nspire

Unread postby critor » 17 Mar 2011, 14:22

Bravo.

Mais effectivement je me doutais que les listes TI étaient de simples tableaux dynamiques.
Image
User avatar
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Level up: 47.9%
 
Posts: 41980
Images: 15866
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
MyCalcs profile
YouTube: critor3000
Twitter: critor2000
GitHub: critor

Re: Optimisation et gestion des listes sur Nspire

Unread postby Levak » 17 Mar 2011, 14:25

critor2000 wrote:Bravo.

Mais effectivement je me doutais que les listes TI étaient de simples tableaux dynamiques.


Non justement, ils sont statiques.
Responsable design/graphique de TI-Planet
I do not get mad at people, I just want them to learn the way I learnt.
ImageTNOC [topic][DL]
nClock [topic][DL]
HideManager [topic][DL]
ZLock [topic][DL]
Theme Editor [topic][DL]
Mes programmes
User avatar
LevakAdmin
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 98.9%
 
Posts: 6414
Images: 22
Joined: 27 Nov 2008, 00:00
Location: 0x1AACC355
Gender: Male
Calculator(s):
MyCalcs profile
Class: BAC+5: Epita (ING3)

Re: Optimisation et gestion des listes sur Nspire

Unread postby Lionel Debroux » 17 Mar 2011, 17:51

La gestion des listes n'est pas mieux que sur les TI-68k, je vois...
Peut-être utilisent-ils toujours le même genre d'algorithmes pour next_expression_index, sans avoir pris en compte le fait que Samuel Stearley avait fait 3-4 fois plus rapide pour cette routine cruciale...
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
User avatar
Lionel DebrouxSuper Modo
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 11.3%
 
Posts: 6865
Joined: 23 Dec 2009, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Class: -
GitHub: debrouxl

Re: Optimisation et gestion des listes sur Nspire

Unread postby Bisam » 17 Mar 2011, 17:54

A mon avis, le plus efficace est d'utiliser la fonction "seq".

l:=seq(i,i,1,10000)

prend environ 5 secondes, affichage compris, ce qui est donc 10 fois plus rapide que la solution que tu proposes lorsque l'on connaît à la fois la longueur et les valeurs. Malheureusement, c'est rarement le cas.

Sans l'affichage, en tapant

l:=seq(i,i,1,15000):1

cela prend moins d'une seconde... mais on ne peut pas aller bien au-delà pour les tests sans avoir un "Dépassement de ressources. Calcul impossible".



PS : Pourquoi utilises-tu "matlist(newmat(1,1000))" au lieu de "newlist(1000)" ?
User avatar
BisamAdmin
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Level up: 69.6%
 
Posts: 5670
Joined: 11 Mar 2008, 00:00
Location: Lyon
Gender: Male
Calculator(s):
MyCalcs profile

Re: Optimisation et gestion des listes sur Nspire

Unread postby Levak » 17 Mar 2011, 20:31

Bisam wrote:A mon avis, le plus efficace est d'utiliser la fonction "seq".

cela prend moins d'une seconde... mais on ne peut pas aller bien au-delà pour les tests sans avoir un "Dépassement de ressources. Calcul impossible".


seq() va justement instancier un nouveau tableau de 1000 éléments et les remplir de manière itérative.
Cela appuis donc mon raisonnement.

En fait, pour Make3D je ne peux pas utiliser seq() car c'est un raisonnement de simulation de face, j'aménage moi-même ma liste avec des éléments à undef pour couper le trait du nuage de point. Or j'utilise augment(), d'où la lenteur...

PS : Pourquoi utilises-tu "matlist(newmat(1,1000))" au lieu de "newlist(1000)" ?

Je l'avais cherchée rapidement dans la bibliothèque sans succès... maintenant, si elle existe ...
Responsable design/graphique de TI-Planet
I do not get mad at people, I just want them to learn the way I learnt.
ImageTNOC [topic][DL]
nClock [topic][DL]
HideManager [topic][DL]
ZLock [topic][DL]
Theme Editor [topic][DL]
Mes programmes
User avatar
LevakAdmin
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 98.9%
 
Posts: 6414
Images: 22
Joined: 27 Nov 2008, 00:00
Location: 0x1AACC355
Gender: Male
Calculator(s):
MyCalcs profile
Class: BAC+5: Epita (ING3)

Re: Optimisation et gestion des listes sur Nspire

Unread postby Loulou 54 » 18 Mar 2011, 18:58

Il faudrait que je regarde si ça fait la même chose sur 68k, ce qui fort probable. J'utilisais souvent la méthode "lente" justement.

EDIT : :cask: En effet, j'ai le même résultat sur TI 89 !

10 secondes pile pour une liste de 100 pour la méthode "longue"
contre 4 secondes pile pour une liste de 100 pour l'autre méthode ! :#top#:
[test réalisé sur VTI, la calculatrice physique mettrait sûrement moins de temps]

Cette méthode nécessite cependant de connaître à l'avance le nombre d'éléments de la liste, ce qui n'est pas toujours le cas, mais sinon, c'est bon à savoir !! =)
Mes programmes => ici !
User avatar
Loulou 54Premium
Niveau 13: CU (Calculateur Universel)
Niveau 13: CU (Calculateur Universel)
Level up: 1.6%
 
Posts: 1985
Images: 8
Joined: 02 Aug 2009, 00:00
Location: 54, près de Metz
Gender: Male
Calculator(s):
MyCalcs profile
Class: Ingé Logiciel chez Amazon

Re: Optimisation et gestion des listes sur Nspire

Unread postby Lionel Debroux » 18 Mar 2011, 19:29

[test réalisé sur VTI, la calculatrice physique mettrait sûrement moins de temps]

A moins que tu utilises une machine particulièrement asthmatique de nos jours (type Pentium 100), non. Les vitesses de VTI et TIEmu sont plutà´t fidèles :):

Mais 4 secondes, pour créer une liste de 100 éléments (des entiers, de plus), est déjà  de l'abus...
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
User avatar
Lionel DebrouxSuper Modo
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 11.3%
 
Posts: 6865
Joined: 23 Dec 2009, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Class: -
GitHub: debrouxl

Re: Optimisation et gestion des listes sur Nspire

Unread postby Folco » 18 Mar 2011, 20:08

lea -100*4(sp),sp
4 micro-secondes :D:
User avatar
Folco
Niveau 8: ER (Espèce Rare: nerd)
Niveau 8: ER (Espèce Rare: nerd)
Level up: 21.5%
 
Posts: 150
Joined: 23 Sep 2010, 00:00
Gender: Male
Calculator(s):
MyCalcs profile
Class: anapu :p

Re: Optimisation et gestion des listes sur Nspire

Unread postby Loulou 54 » 18 Mar 2011, 20:15

Lionel Debroux wrote:
[test réalisé sur VTI, la calculatrice physique mettrait sûrement moins de temps]

A moins que tu utilises une machine particulièrement asthmatique de nos jours (type Pentium 100), non. Les vitesses de VTI et TIEmu sont plutôt fidèles :):

Mais 4 secondes, pour créer une liste de 100 éléments (des entiers, de plus), est déjà de l'abus...


Ti Emu, je n'ai pas fait gaffe, mais avec VTI, j'ai plus que l'impression que tout est plus lent ! (pas énormément non plus bien sûr.)
Bon, sauf si on décoche "restrict to actuall speed" :D:
Mes programmes => ici !
User avatar
Loulou 54Premium
Niveau 13: CU (Calculateur Universel)
Niveau 13: CU (Calculateur Universel)
Level up: 1.6%
 
Posts: 1985
Images: 8
Joined: 02 Aug 2009, 00:00
Location: 54, près de Metz
Gender: Male
Calculator(s):
MyCalcs profile
Class: Ingé Logiciel chez Amazon

Next

Return to Nspire-Basic

Who is online

Users browsing this forum: ClaudeBot [spider] and 4 guests

-
Search
-
Social TI-Planet
-
Featured topics
Comparaisons des meilleurs prix pour acheter sa calculatrice !
"1 calculatrice pour tous", le programme solidaire de Texas Instruments. Reçois gratuitement et sans aucune obligation d'achat, 5 calculatrices couleur programmables en Python à donner aux élèves les plus nécessiteux de ton lycée. Tu peux recevoir au choix 5 TI-82 Advanced Edition Python ou bien 5 TI-83 Premium CE Edition Python.
Enseignant(e), reçois gratuitement 1 exemplaire de test de la TI-82 Advanced Edition Python. À demander d'ici le 31 décembre 2024.
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
1234
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...
Donate
Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
913 utilisateurs:
>879 invités
>26 membres
>8 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)