목록 상자 콘텐츠 업데이트를 최적화하는 중입니다.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 루프입니다. 분명히 이것은 목록 상자의 모든 항목을 선택하기 위해 찾을 수 있는 유일한 방법이지만 행 수에 따라 엄청나게 확장됩니다.
내 질문은 성능이 저하되지 않는 목록 상자의 내용을 업데이트하는 가장 잘 알려진 방법이 있는지입니다. 나는 다음과 같은 가능한 대안을 찾고 있습니다.
- 목록 상자의 내용을 설정하는 최적의 방법입니다.
- 목록 상자의 모든 항목을 선택하는 빠른 방법입니다.
어떤 피드백이나 제안이라도 대단히 감사하겠습니다.
자동화 및 스크립팅데이터 탐색 및 시각화맥 OSRe: 목록 상자 콘텐츠 업데이트를 최적화하고 있습니다.목록 상자에 몇 개의 항목이 포함될 것으로 예상합니까? 1에는 << Set Items()를 사용할 수 있습니다.
편집하다:
Re: 목록 상자 콘텐츠 업데이트를 최적화하고 있습니다.안녕하세요 Jarmo 님,
답장을 보내주셔서 감사합니다. << Set Items()를 사용해 보고 <<보다 빠른지 확인하겠습니다.
항목 수는 약 ~30,000개 정도입니다. 이상한 점은 스크립트를 로드할 때 처음부터 lb를 채우는 데 훨씬 적은 시간이 걸리고 내용을 업데이트하는 데 시간이 걸린다는 것입니다. 목록 상자를 삭제하는 방법으로 생각하고 있었습니다. 그런 다음 다시 생성하지만 스크립트에서 이러한 모든 변경 사항을 수행하는 것은 매우 어려울 수 있습니다.
Re: 목록 상자 콘텐츠 업데이트를 최적화하고 있습니다.제 생각에는 이 두 가지 방법 모두 상당히 빠른 것 같습니다.
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: 목록 상자 콘텐츠 업데이트를 최적화하는 중입니다.한 가지 주목해야 할 점은 << 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();
Re: 목록 상자 콘텐츠 업데이트를 최적화하고 있습니다.시연해주셔서 정말 감사드립니다. 내 컴퓨터에서는 두 번째 방법이 약 5배 더 빠르며, 보시다시피 첫 번째 방법의 대부분의 시간은 선택된 루프 설정에 소요됩니다.