Optimisation de la mise à jour du contenu de la list box.Bonjour la communauté JMP,
Dernièrement, je cherchais à améliorer les performances de mes scripts JSL internes et j'ai trouvé les problèmes de performances suivants que j'aimerais résoudre.
Prenons le script suivant (JMP 17.2 PRO fonctionnant sur macOS) :
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
values = Column( dt, 1 )[dt << get rows where( Excluded( Row State() ) != 1 )];
new window("test",
lb = list box( values, nlines(10), width(100), ),
b = button box("reset", reset_lb),
);
reset_lb = expr(
lb << remove all();
lb << append(values);
Nnames = N Items(values);
for(i = 1, i <= Nnames, i++,
lb << set selected(i);
);
);Dans certains de mes scripts, j'utilise des zones de liste mises à jour dynamiquement. Pour modifier le contenu des list box, j'utilise les fonctions << remove() et << append() , elles fonctionnent très bien mais j'ai peur que cette méthode ne s'adapte pas très bien au nombre de lignes, une autre partie qui étonnamment fonctionne très lentement est la boucle for avec << set selected(), apparemment c'est la seule méthode que j'ai pu trouver pour sélectionner tous les éléments dans une zone de liste mais elle évolue terriblement avec le nombre de lignes.
Ma question est de savoir s'il existe des moyens les plus connus de mettre à jour le contenu des zones de liste qui ne ralentissent pas en termes de performances. Je recherche des alternatives possibles qui feraient :
- méthode optimale pour définir le contenu de la zone de liste.
- moyen rapide de sélectionner tous les éléments de la zone de liste.
Tout commentaire ou suggestion serait grandement apprécié.
Automatisation et scriptsExploration et visualisation des donnéesmacOSRe : Optimisation de la mise à jour du contenu de la list box.Combien d’éléments comptez-vous avoir dans la zone de liste ? Pour 1, il y a << Set Items() que vous pouvez utiliser
Modifier:
Re : Optimisation de la mise à jour du contenu de la list box.Bonjour Jarmo,
Merci pour la réponse, je vais essayer d'utiliser << Set Items() et vérifierai si c'est plus rapide que <
Concernant le nombre d'éléments, il est d'environ ~ 30 000, ce qui est étrange, c'est que lorsque je charge le script, il faut beaucoup moins pour remplir le lb à partir de zéro que pour mettre à jour le contenu, je pensais à une méthode pour supprimer les zones de liste. puis créez-les à nouveau, mais il peut être assez difficile d'effectuer toutes ces modifications dans les scripts.
Re : Optimisation de la mise à jour du contenu de la list box.À mon avis, ces deux méthodes semblent assez rapides
Names Default To Here(1);
rowcount = 100000;
dt = New Table("Demo",
Add Rows(rowcount),
New Column("Values", Character, Nominal, << Set Each Value(
Hex(Row()) || Hex(Row()) || Hex(Row())
))
);
values = Column(dt, 1)[dt << get rows where(Excluded(Row State()) != 1)];
Close(dt, no save);
nw = New Window("test",
H List Box(
H List Box(
lb1 = List Box(values, nlines(10), width(100)),
Button Box("reset", reset_lb1),
)
),
H List Box(
H List Box(
lb2_collector = V List Box(
lb2 = List Box(values, nlines(10), width(100)),
),
Button Box("reset2", reset_lb2),
)
)
);
reset_lb1 = Expr(
start1 = HP Time();
lb1 << Set Items(values);
end1 = HP Time();
start2 = end1;
Nnames = N Items(values);
For(i = 1, i <= Nnames, i++,
lb1 << set selected(i);
);
end2 = HP Time();
Show((end1 - start1)/1e6, (end2-start2)/1e6, (end2-start1)/1e6);
);
reset_lb2 = Expr(
start3 = HP Time();
vlb = V List Box(lb2 = List Box(values, nlines(10), width(100)));
For Each({val, idx}, values,
lb2 << set selected(idx);
);
While(!IsEmpty(lb2_collector << child),
(lb2_collector << child) << delete box;
);
lb2_collector << Append(vlb);
end3 = HP Time();
Show((end3 - start3)/1e6);
);
Write();Re : Optimisation de la mise à jour du contenu de la list box.Une chose à noter est que << Set Selected exécutera le script associé à la zone de liste (s'il y en a une) par défaut. Si vous avez un script associé mais que vous ne souhaitez pas qu'il se déclenche avec chaque ensemble, utilisez << Set Selected(idx, 1, Run Script(0)) (vous pouvez le déclencher sur le dernier ensemble si vous en avez besoin)
Names Default To Here(1);
rowcount = 100000;
dt = New Table("Demo",
Add Rows(rowcount),
New Column("Values", Character, Nominal, << Set Each Value(
Hex(Row()) || Hex(Row()) || Hex(Row())
))
);
values = Column(dt, 1)[dt << get rows where(Excluded(Row State()) != 1)];
Close(dt, no save);
nw = New Window("test",
H List Box(
lb2_collector = V List Box(
lb2 = List Box(values, nlines(10), width(100), Show(1)),
),
Button Box("reset2", reset_lb2),
)
);
reset_lb2 = Expr(
start3 = HP Time();
vlb = V List Box(lb2 = List Box(values, nlines(10), width(100), Show(1)));
For(i = 1, i < N Items(values), i++,
lb2 << set selected(i, 1, Run Script(0));
);
lb2 << set selected(N Items(values), 1, Run Script(1));
While(!IsEmpty(lb2_collector << child),
(lb2_collector << child) << delete box;
);
lb2_collector << Append(vlb);
end3 = HP Time();
Show((end3 - start3)/1e6);
);
Write();
Re : Optimisation de la mise à jour du contenu de la list box.Merci beaucoup pour la démonstration. Sur ma machine, la deuxième méthode est environ 5 fois plus rapide et, comme vous pouvez le voir, la plupart du temps de la première méthode est consacré à la boucle sélectionnée.