Optimización de la actualización del contenido del cuadro de lista.Hola comunidad JMP,
Últimamente, estuve buscando mejorar el rendimiento de mis scripts JSL internos y encontré los siguientes problemas de rendimiento que me gustaría abordar.
Tomemos el siguiente script (JMP 17.2 PRO ejecutándose en 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);
);
);En algunos de mis scripts estoy usando cuadros de lista que se actualizan dinámicamente. Para cambiar el contenido de los cuadros de lista utilizo las funciones << remove() y << append() , funcionan bien pero me temo que este método no escala muy bien con el número de filas, otra parte que sorprendentemente funciona muy lento es el bucle for con << set selected(), aparentemente este es el único método que pude encontrar para seleccionar todos los elementos en un cuadro de lista, pero escala terriblemente con el número de filas.
Mi pregunta es si existe alguna forma más conocida de actualizar el contenido de los cuadros de lista que no sea lenta en cuanto al rendimiento. Estoy buscando posibles alternativas que harían:
- Método óptimo para configurar el contenido del cuadro de lista.
- forma rápida de seleccionar todos los elementos del cuadro de lista.
Cualquier comentario o sugerencia será muy apreciada.
Automatización y secuencias de comandosExploración y visualización de datosMac OSRe: Optimización de la actualización del contenido del cuadro de lista.¿Cuántos elementos espera tener en el cuadro de lista? Para 1 hay << Establecer elementos() que puedes usar
Editar:
Re: Optimización de la actualización del contenido del cuadro de lista.Hola Jarmo,
Gracias por la respuesta, intentaré usar << Set Items() y comprobaré si es más rápido que <
Con respecto a la cantidad de elementos, es alrededor de ~ 30k, lo extraño es que cuando cargo el script, se necesita mucho menos para completar el lb desde cero que para actualizar el contenido. Estaba pensando en un método para eliminar los cuadros de lista. y luego crearlos nuevamente, pero puede resultar bastante difícil realizar todos estos cambios en los scripts.
Re: Optimización de la actualización del contenido del cuadro de lista.En mi opinión, ambos métodos parecen bastante rápidos.
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: Optimización de la actualización del contenido del cuadro de lista.Una cosa a tener en cuenta es que << Establecer seleccionados ejecutará el script asociado al cuadro de lista (si lo hay) de forma predeterminada. Si tiene un script asociado pero no desea que se active con cada conjunto, use << Set Selected(idx, 1, Run Script(0)) (puede activarlo en el último conjunto si es necesario)
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: Optimización de la actualización del contenido del cuadro de lista.Muchas gracias por la demostración. En mi máquina, el segundo método es aproximadamente 5 veces más rápido y, como puede ver, la mayor parte del tiempo del primer método se dedica al ciclo seleccionado.