워드 문서의 모든 테이블을 반복하는 코드가 있으며 모든 셀의 너비 값을 읽습니다. 어떤 이유로 Windows가 최소화 될 때이 코드가 약 5-10 배 더 빠르게 실행됩니다. 아이디어를 얻으려면 with the window maximized, it takes ~0.02 seconds to make the Cell.Width call
을 실행하면 with the window minimized, it takes .001 to .0015 seconds per call
이됩니다.Word 창을 최소화하면 COM 속도가 빨라 집니까?
누구나이 문제의 원인이 될 수 있으며 창을 최소화하지 않고 이러한 결과를 재현 할 수 있는지 확인하십시오. 사용자로서 작업을 수행하기 위해 윈도우를 무작위로 최소화/최대화하는 것은 매우 이상합니다.
//doc and app are the active Document and Application respectively.
try
{
app.ScreenUpdating = false;
//app.WindowState = word.WdWindowState.wdWindowStateMinimize; //enabling this improves speeds by 5x to 10x
foreach (word.Table table in doc.Tables)
{
//loop over every cell in a table and read/store its cell.Width value.
}
}
finally
{
//you can alternatively store the original values here and restore them to that. For simplicity, I did not do that here.
app.ScreenUpdating = true;
app.WindowState = word.WdWindowState.wdWindowStateMaximize;
}
Excel에서이 동작을 발견했는데 이것이 확실한 대답은 아니지만 UI가 표시되어있을 때만 실행되는 코드가 있어야한다고 가정했습니다. 예를 들어 디스플레이를 업데이트하기 위해 이중 버퍼링을 수행하는 코드 . 내 생각에 Microsoft는 성능을 향상시키기 위해이 방법으로 코딩 한 것입니다. SIt는 중요하지 않을 때 UI 사이클을 건너 뛰는 논리적 인 의미를가집니다. 그러나 Office 개발 팀 직원이이 질문을보고 답변을 게시하지 않는 한 이에 대한 확실한 답이 없음을 확신합니다. – David
나는 항상 워드에서도 이것을 눈치 챘다. MergeFields를 업데이트하는 중에 응용 프로그램을 최소화하여 보관합니다. 열어두면 모든 업데이트가 문서를 이동시켜 텍스트가 변경된 위치를 표시합니다. 물론 이것은 프로세스 속도를 늦 춥니 다. – Steve
screenUpdating = false로 설정하면 UI에서 발생해야하는 버퍼링을 처리 할 수 있다고 생각했습니다. 우리가 통제 할 수없는 다른 일이 있다고 생각하니? "읽기"작업으로 인해이 효과가 발생하는 것도 드문 것 같습니다. 쓰기 작업이면 더 이해할 수 있습니다. – Shark