쿼드 코어 Acer Aspire S3 Ultrabook에서 실행되는 VBA 프로그램이 있습니다. 문제는 CPU의 25%만 사용한다는 것입니다(다른 프로세스를 합치면 ~1% 사용). 노트북은 Windows 8.0을 실행합니다. Excel 버전은 2013(32비트)입니다. 시스템 RAM의 55%만 사용되며 Excel에서는 55%의 절반을 사용합니다.
엑셀에서는 코어가 1개만 사용되기 때문에 아마 25% 정도만 사용되는 것 같아요. 그러나 나는 이 이론을 뒷받침할 어떤 것도 갖고 있지 않습니다. 프로그램 속도를 높이려면 어떻게 해야 합니까?
감사해요.
답변1
사용하려는 프로그램이 단일 스레드인 것 같습니다. 즉, 단일 코어만 사용할 수 있고 다른 코어는 존재하지 않는다는 의미입니다. 더 빠른 단일 코어 클럭 속도를 갖춘 프로세서를 구입하거나 멀티스레딩을 지원하는 프로그램을 사용하는 것 외에는 속도를 높이는 구체적인 방법이 없습니다.
답변2
아래의 모든 내용은 Excel 2007 및 이전 버전에 적용됩니다. 에 따르면링크위의 댓글에 게시된 @haulicij007에 따르면 Excel 2013에는 멀티스레딩에 대한 일부 기본 지원이 있습니다. 즉, 숙련된 프로그래머가 아니면 그냥 잊어버리라는 경고가 여전히 적용됩니다.
불행하게도 VBA는 멀티스레딩을 지원하지 않으므로 VBA 계산은 프로세서의 한 코어로 제한됩니다.
그러나 VBscript 파일을 생성하고 동시에 실행하여 VBA를 속여 여러 스레드를 실행하는 고급 방법이 있습니다. 이렇게 하면 Excel 프로세스 외부에서 코드를 실행하여 문제를 해결하고 Windows에서 다른 스레드에 할당된 리소스를 관리할 수 있습니다.
즉, 이 작업을 수행하려면 코드의 논리를 완전히 다시 생각해야 합니다(즉, 작업을 동시에 실행하는 데 적합한 방식으로 작업을 나누는 방법을 찾아야 합니다). 귀하의 프로젝트에 적합하지 않을 것입니다. 나는 이것을 직접 구현한 적이 없기 때문에 이미 말한 내용을 말하는 것 외에는 더 이상 도움을 드릴 수 없습니다.
하지만 토끼 굴에 들어가고 싶다면 여기흥미로운 블로그 게시물이는 이것이 수행되는 예를 보여줍니다. 주의할 점: 숙련된 프로그래머가 아니라면 이 아이디어를 잊어버리고 VBA가 단일 스레드에서 실행된다는 점을 받아들이는 것이 좋습니다.
대담한 개발자를 위한 Stack Overflow의 기타 리소스:
https://stackoverflow.com/q/19159025/657668
https://stackoverflow.com/q/5721564/657668
물론 여러 스레드를 사용하지 않고 VBA 코드를 최적화하는 다른 방법도 있습니다. 코드를 보지 않고서는 명확한 제안을 하는 것이 불가능하지만 다음은 일반적인 용의자 몇 가지입니다.
- 더 빠른 처리를 위해 시트의 데이터를 배열로 로드하세요. 워크시트와의 상호 작용은 VBA 실행의 주요 병목 현상이며 배열 작업을 통해 최소화할 수 있습니다.
- 관련된 문제는 셀이 변경될 때마다 통합 문서를 다시 계산하는 Excel입니다. 이는 설정으로 방지할 수 있습니다
Application.Calculation = xlManual
.Application.Calculation = xlAutomatic
Sub를 종료하기 전에 다시 설정하세요 .
답변3
다른 사람들이 말했듯이 기본적으로 VBA는 다중 스레드가 아닙니다. 속도를 높이려면 다른 언어로 사용자 정의 함수(UDF)를 작성하는 것이 좋습니다.
ExcelDNA와 C# 또는 VB.Net을 사용하는 것이 좋습니다. C# 작성 방법을 이미 알고 있고 UDF 내에서 멀티스레딩을 제어할 수 있는 경우 사용하기가 매우 쉽습니다.
답변4
위의 다른 사람들이 말했듯이 스레딩이 답이 될 수 있지만 실제로는 실현 가능한 솔루션이 아니며 64비트로 업그레이드해도 별 차이가 없습니다. 시도해 볼 수 있는 한 가지는 프로세스의 우선순위를 높이는 것입니다. 이를 수행하는 방법을 볼 수 있습니다.여기.
프로그램의 다른 곳에서 또 다른 병목 현상(예: 디스크 읽기/쓰기)이 있을 수 있으므로 스크립트가 더 빨라질지 여부를 말하기는 어렵지만 적어도 Windows에 스크립트보다 우선 순위가 더 높다는 사실을 알려줄 것입니다. 다른 프로세스.