Ottimizzazione dell'aggiornamento del contenuto della casella di riepilogo.Ciao comunità JMP,
Ultimamente, stavo cercando di migliorare le prestazioni dei miei script JSL interni e ho riscontrato i seguenti problemi di prestazioni che vorrei risolvere.
Prendiamo il seguente script (JMP 17.2 PRO in esecuzione su 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);
);
);In alcuni dei miei script utilizzo caselle di riepilogo aggiornate dinamicamente. Per modificare il contenuto delle caselle di riepilogo utilizzo le funzioni < e < , funzionano bene ma temo che questo metodo non si adatti molto bene al numero di righe, un'altra parte che sorprendentemente funziona molto lentamente è il ciclo for con << set selezionato(), apparentemente questo è l'unico metodo che ho trovato per selezionare tutti gli elementi in una casella di riepilogo ma si adatta terribilmente con il numero di righe.
La mia domanda è se esistono modi migliori per aggiornare il contenuto delle caselle di riepilogo che non rallentino le prestazioni. Sto cercando possibili alternative che farebbero:
- metodo ottimale per impostare il contenuto della casella di riepilogo.
- modo rapido per selezionare tutti gli elementi della casella di riepilogo.
Qualsiasi feedback o suggerimento sarebbe molto apprezzato.
Automazione e scriptingEsplorazione e visualizzazione dei datiMac OSRi: Ottimizzazione dell'aggiornamento del contenuto della casella di riepilogo.Quanti elementi prevedi di avere nella casella di riepilogo? Per 1 c'è << Imposta elementi() che puoi usare
Modificare:
Ri: Ottimizzazione dell'aggiornamento del contenuto della casella di riepilogo.Ciao Jarmo,
Grazie per la risposta, proverò a utilizzare << Set Items() e controllerò se è più veloce di <
Per quanto riguarda il numero di elementi, si tratta di circa ~ 30k, la cosa strana è che quando carico lo script ci vuole molto meno per popolare lb da zero rispetto ad aggiornare i contenuti, stavo pensando come metodo per eliminare le caselle di riepilogo e poi crearli di nuovo, ma potrebbe essere piuttosto difficile apportare tutte queste modifiche negli script.
Ri: Ottimizzazione dell'aggiornamento del contenuto della casella di riepilogo.Entrambi questi metodi sembrano abbastanza veloci secondo me
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();Ri: Ottimizzazione dell'aggiornamento del contenuto della casella di riepilogo.Una cosa da notare è che << Imposta selezionato eseguirà lo script associato alla casella di riepilogo (se presente) per impostazione predefinita. Se hai uno script associato ma non vuoi che si attivi con ogni set, usa << Set Selected(idx, 1, Run Script(0)) (puoi attivarlo sull'ultimo set se necessario)
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();
Ri: Ottimizzazione dell'aggiornamento del contenuto della casella di riepilogo.Grazie mille per la dimostrazione. Sulla mia macchina il secondo metodo è circa 5 volte più veloce e, come puoi vedere, la maggior parte del tempo del primo metodo viene impiegato per il ciclo selezionato impostato.