優化列錶框內容更新。JMP 社群您好,
最近,我正在研究提高內部 JSL 腳本的效能,並發現了以下我想解決的效能問題。
讓我們使用以下腳本(在 macOS 上運行的 JMP 17.2 PRO):
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);
);
);在我的一些腳本中,我使用動態更新的列錶框。為了更改列錶框的內容,我使用<和<函數,它們工作得很好,但我擔心這種方法不能很好地隨行數縮放,這是令人驚訝的另一部分運行速度非常慢的是帶有<< set selected() 的 for 循環,顯然這是我能找到的用於選擇列錶框中所有項目的唯一方法,但它會隨著行數的變化而急劇變化。
我的問題是是否有任何已知的方法來更新列錶框的內容,並且效能不會降低。我正在尋找可能的替代方案:
- 設定列錶框內容的最佳方法。
- 選擇列錶框中所有項目的快速方法。
任何反饋或建議將不勝感激。
自動化和腳本編寫數據探索和視覺化蘋果系統回覆:優化列錶框內容更新。您希望列錶框中有多少項?對於 1,您可以使用 << Set Items()
編輯:
回覆:優化列錶框內容更新。你好,賈莫,
感謝您的回复,我將嘗試使用 << Set Items() 並檢查它是否比 <<
關於項目數量,大約約為30k,奇怪的是,當我加載腳本時,從頭開始填充lb 所需的時間要少得多,然後更新內容所需的時間要少得多,我正在考慮作為刪除列表框的方法然後再次創建它們,但在腳本中進行所有這些更改可能非常困難。
回覆:優化列錶框內容更新。我認為這兩種方法都感覺相當快
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();回覆:優化列錶框內容更新。需要注意的一件事是 << Set Selected 將預設執行與列錶框(如果有)關聯的腳本。如果您有與之關聯的腳本,但不希望它在每組中觸發,請使用 << Set Selected(idx, 1, Run Script(0)) (如果需要,您可以在最後一組上觸發它)
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();
回覆:優化列錶框內容更新。非常感謝您的演示。在我的機器上,第二種方法大約快 5 倍,正如您所看到的,第一種方法的大部分時間都花在了設定的選定循環上。