프로그램 코드 크기를 최적화하는 많은 기술 중에서 대부분은 코드에서 불필요한 요소를 제거하는 것을 포함합니다. Visual Basic은 응용 프로그램을 컴파일할 때 특정 요소를 자동으로 제거합니다. 식별자 이름, 주석 및 빈 줄의 길이나 수에는 제한이 없습니다. 응용 프로그램이 .EXE 파일로 실행될 때 이러한 요소는 응용 프로그램이 차지하는 메모리 크기에 영향을 미치지 않습니다. 변수, 양식, 프로시저 등의 다른 요소는 메모리 공간을 차지합니다. 보다 효율적으로 만들려면 합리화하는 것이 좋습니다. 다음은 애플리케이션에 필요한 메모리를 줄이고 코드 크기를 줄이는 데 사용할 수 있는 6가지 방법을 소개합니다. 초보자에게 도움이 되기를 바랍니다.
1. 양식 및 컨트롤 로드 수를 줄이고 텍스트 상자 대신 레이블을 사용합니다.
로드된 각 양식은 표시 여부에 관계없이 일정한 양의 메모리를 차지합니다. 이 양은 양식에 있는 컨트롤의 유형과 수, 양식에 있는 비트맵의 크기 등에 따라 달라집니다. 양식을 표시해야 하는 경우에만 양식을 로드하고 더 이상 필요하지 않은 경우 양식을 숨기는 대신 양식을 언로드하십시오. 양식의 속성, 메서드, 컨트롤에 대한 참조나 New로 선언된 양식 변수에 대한 참조는 Visual Basic에서 양식을 로드하게 한다는 점을 기억하십시오.
Unload 메서드를 사용하여 양식을 언로드하는 경우 양식이 차지하는 공간의 일부만 해제할 수 있습니다. 모든 공간을 확보하려면 Nothing 키워드를 사용하여 양식 참조를 무효화하세요.
응용 프로그램을 디자인할 때 양식에서는 가능한 한 적은 수의 컨트롤을 사용해야 합니다. 실제 제한은 컨트롤 유형과 시스템에 따라 다르지만 실제로 컨트롤 수가 많은 양식은 느리게 실행됩니다. 관련 기술은 폼에 동일한 유형의 컨트롤을 많이 배치하는 대신 디자인할 때 가능할 때마다 컨트롤 배열을 사용하는 것입니다. 컨트롤 배열은 공통 이름과 유형을 가진 컨트롤 그룹입니다. 그들의 사건 진행 과정도 마찬가지다. 디자인 타임에 컨트롤 배열을 사용하여 컨트롤을 추가하면 동일한 유형의 여러 컨트롤을 양식에 직접 추가하는 것보다 리소스가 덜 소모됩니다. 컨트롤 배열은 여러 컨트롤이 코드를 공유하려는 경우에도 유용합니다. 레이블 컨트롤인 Label은 텍스트 상자 텍스트 상자보다 Windows 리소스를 적게 차지하므로 가능하면 텍스트 상자 대신 레이블을 사용해야 합니다. 예를 들어, 양식의 숨겨진 컨트롤에 텍스트를 보관해야 하는 경우 레이블을 사용하는 것이 더 효과적입니다.
2. 디스크 파일이나 리소스 및 조직 모듈을 사용하십시오.
디자인 타임에 애플리케이션에 직접 배치된 데이터(예: 리터럴 문자열 및 속성이나 코드의 값)는 런타임 시 애플리케이션이 차지하는 메모리를 증가시킵니다. 런타임 시 디스크 파일이나 리소스에서 데이터를 로드하면 메모리 사용량이 줄어듭니다. 이는 큰 비트맵과 문자열에 특히 유용합니다. 리소스 파일은 실제로 일련의 독립적인 문자열, 비트맵 또는 기타 항목으로 구성되며 각 항목에는 고유 식별자가 있습니다. 리소스 파일은 Microsoft Visual C에서 제공되는 것과 유사한 텍스트 편집기 및 리소스 컴파일러를 사용하여 생성할 수 있습니다. 컴파일된 리소스 파일의 확장자는 .res입니다.
Visual Basic은 필요할 때만 모듈을 로드합니다. 즉, 코드가 모듈의 프로시저를 호출하면 모듈이 메모리에 로드됩니다. 특정 모듈의 프로시저가 호출되지 않으면 Visual Basic은 모듈을 로드하지 않습니다. 따라서 관련 프로시저를 동일한 모듈에 넣고 Visual Basic이 필요할 때만 모듈을 로드하도록 하십시오.
3. Variant 데이터 유형 교체를 고려하세요.
Variant 데이터 유형은 사용이 매우 유연하지만 다른 데이터 유형보다 더 많은 메모리를 차지합니다. 응용 프로그램에서 초과 공간을 압축하려면 Variant 변수를 다른 데이터 유형으로 바꾸는 것을 고려해야 하며, 특히 Variant 변수 배열을 바꾸는 것을 고려해야 합니다.
각 Variant는 16바이트를 차지하고 Integer는 2바이트, Double은 8바이트를 차지합니다. 가변 길이 문자열 변수는 4바이트와 문자열의 각 문자에 대해 1바이트를 차지합니다. 그러나 문자열을 포함하는 각 Variant는 16바이트에 문자열 바이트의 각 문자에 대해 1바이트를 더합니다. Variant 변수는 너무 크기 때문에 로컬 변수나 프로시저에 대한 인수로 사용될 때 스택 공간을 너무 빨리 소모하기 때문에 특히 짜증스럽습니다. 그러나 어떤 경우에는 Variant 대신 다른 데이터 유형을 사용하면 유연성이 줄어들고 손실된 유연성을 보충하기 위해 더 많은 코드를 추가해야 합니다. 결과적으로 크기가 실제로 줄어들지 않습니다.
4. 삭제 시 동적 배열을 사용하고 메모리를 회수하세요.
고정 배열 대신 동적 배열을 사용하십시오. 동적 배열의 데이터가 더 이상 필요하지 않은 경우 Erase 또는 ReDimPReserve를 사용하여 불필요한 데이터를 삭제하고 배열에서 사용하는 메모리를 회수합니다. 예를 들어, 동적 배열에서 사용하는 공간을 회수하려면 다음 코드를 사용하십시오.
여기에서 Erase는 배열을 완전히 삭제하는 반면 ReDimPreserve는 내용을 잃지 않고 배열을 줄입니다.
고정 크기 배열을 삭제하면 배열이 차지한 공간이 회수되지 않고 단순히 배열의 각 요소에서 값이 지워집니다. 요소가 문자열이거나 문자열이나 배열을 포함하는 변형인 경우 배열을 삭제하면 배열 자체가 차지한 메모리가 아니라 해당 문자열이나 변형이 차지한 메모리가 회수됩니다.
5. 문자열이나 객체 변수가 사용하는 공간 회수
프로세스가 끝나면 (비정적) 로컬 문자열 및 배열 변수가 사용하는 공간을 자동으로 회수할 수 있습니다. 그러나 전역 및 모듈 수준 문자열과 배열 변수는 전체 프로그램이 끝날 때까지 유지됩니다. 애플리케이션을 가능한 한 작게 만들려면 이러한 변수가 사용하는 공간을 최대한 확보해야 합니다. 길이가 0인 문자열을 문자열 변수에 할당하면 공간이 회수됩니다.
마찬가지로 개체 변수를 Nothing으로 설정하면 개체가 사용하는 공간의 일부(전부는 아님)가 회수됩니다. 예를 들어 Form 개체 변수를 삭제하려면 다음을 수행합니다.
명시적인 양식 변수를 사용하지 않더라도 더 이상 사용되지 않는 양식을 단순히 숨기기보다는 언로드하도록 주의해야 합니다.
6. 데드 코드와 쓸모없는 변수 제거
애플리케이션을 개발하고 수정할 때 데드 코드, 즉 코드의 전체 프로세스가 어디에서도 호출되지 않는 상태로 남을 수 있습니다. 사용하지 않는 변수가 선언되어 있을 수도 있습니다. Visual Basic은 실제로 .exe 파일을 만들 때 쓸모 없는 상수를 삭제할 수 있지만 쓸모 없는 변수와 데드 코드는 삭제할 수 없습니다. 쓸모없는 변수와 데드 코드를 찾아 제거하려면 코드를 주의 깊게 검토하세요. 예를 들어, .exe를 실행할 때 Debug.Print 문은 무시되지만 .exe 파일에는 자주 나타납니다.
.exe 파일을 생성할 때 문자열과 변수를 매개 변수로 포함하는 Debug.Print 문은 컴파일되지 않습니다. 그러나 함수를 매개 변수로 포함하는 Debug.Print 문의 경우 컴파일러는 해당 함수 자체를 무시하고 함수를 컴파일합니다. 따라서 애플리케이션이 실행되는 동안 함수가 호출되지만 반환 값은 무시됩니다. .exe 파일에서 함수가 Debug.Print의 매개변수로 나타날 경우 공간과 CPU 사이클 시간을 차지하게 되므로 exe 파일을 생성하기 전에 이러한 명령문을 삭제하는 것이 가장 좋습니다.
특정 변수에 대한 참조를 검색하려면 편집 메뉴의 찾기 명령을 사용하십시오. 또는 각 모듈에 OptionExplicit 문이 포함되어 있는 경우 변수 선언을 삭제하거나 주석 처리한 후 응용 프로그램을 실행하면 해당 변수의 사용 여부를 빠르게 확인할 수 있습니다. 이 변수를 사용하면 Visual Basic에서 오류가 발생합니다. 오류가 발생하지 않으면 변수가 사용되지 않습니다. ->