동적으로 링크 된 라이브러리는 런타임에 해결되어야하므로 동적 링크 된 실행 파일보다 정적으로 링크 된 실행 파일이 더 빠릅니까?정적으로 링크 된 실행 파일이 동적으로 링크 된 실행 파일보다 빠릅니까?
답변
디스크 상태 및 다른 프로세스에서 DLL을 사용할 수 있는지 여부에 따라 다릅니다. 콜드 스타트 (Cold Start)는 프로그램과 DLL이 전에는로드되지 않았을 때 발생합니다. DLL이없는 EXE는 한 파일 만 찾을 필요가 있기 때문에 더 빠른 콜드 스타트를 갖습니다. 이 경우가 거의 없을 정도로 쪼개지는 디스크가 있어야합니다.
DLL은 이미 다른 프로세스에서로드되었을 때 갚을 수 있습니다. 이제 DLL의 코드 페이지는 간단히 공유됩니다. 시작 오버 헤드는 으로 매우 낮습니다.은 낮고 메모리 사용은 효율적입니다.
다소 비슷한 경우는 웜 스타트 (warm start)로, DLL이 이전에 사용 된 시간부터 파일 시스템 캐시에서 계속 사용할 수있는 시작입니다. 추운 날과 따뜻한 시작의 차이는 느린 디스크에서 상당히 중요 할 수 있습니다. 모두가 SSD를 좋아하는 이유 중 하나입니다.
정적 연결은 모든 라이브러리 코드를 실행 파일에 직접 컴파일해야하기 때문에 동적 연결보다 더 큰 실행 파일을 생성합니다. 이로 인해 더 이상 라이브러리에서 함수를 호출하지 않아도되고 오버 헤드가 줄어들고로드 시간이 눈에 띄게 빨라지는 경우도 있습니다.
런타임에 공유 코드 라이브러리에 호출을하기 때문에 동적으로 링크 된 실행 파일은 더 작아집니다. 여기에는 여러 가지 이점이 있지만 속도 나 최적화 관점에서 중요한 점은 디스크 공간과 메모리 사용량이 줄어들고 리소스 사용량이 감소하여 (특히 Windows에서) 리소스 사용량이 줄어들어 멀티 태스킹이 향상된다는 것입니다.
그렇다면 절충점이 있습니다 : 왜 둘 중 어느 쪽이 조금 빠를까요? 프로그램의 속도에 민감한 루틴이 라이브러리 기능에 대한 호출에 어느 정도까지 의존하는지와 같은 많은 다른 것들에 달려 있습니다. 그러나 위에서 언급 한 중요한 점은 여유롭게 일 수 있다는 것입니다. 속도 차이는 거의 입니다.이며 예상되는 정상적인 변동과 구별하기가 어렵습니다.
정말 신경 쓰면 벤치마킹하고 확인하십시오. 그러나 이것은 시간 낭비이며 응용 프로그램의 속도를 높이는보다 효과적이고 중요한 방법이 있음을 권고드립니다. "동적 링크 또는 정적 링크"결정을 내릴 때 속도 이외의 요인을 고려하면 장기적으로 훨씬 나아질 것입니다. 예를 들어 정적 링크는 특히 다양한 사용자 환경에 응용 프로그램을보다 쉽게 배포해야하는 경우 고려할 가치가 있습니다. 또는 응용 프로그램이 손가락을 들지 않고도 호출하는 공유 라이브러리에 대한 업그레이드의 이점을 자동으로 얻을 수 있기 때문에 동적 링크가 더 나은 옵션이 될 수 있습니다 (특히 그러한 공유 라이브러리가 자신의 라이브러리가 아닌 경우).
편집 :
C/C++ 응용 프로그램을 정적으로 링크 비주얼 C로 ++ 라이브러리를 재배포하는 것은 권장하지 않습니다 :은 Microsoft는 prefer dynamic linking over static linking이 특정 추천합니다. 종종 은 프로그램을 Visual C++ 라이브러리에 정적으로 연결함으로써 의 응용 프로그램 성능을 크게 향상시킬 수 있다고 가정합니다. 그러나 동적로드의 성능에 미치는 영향 Visual C++ 라이브러리는 거의 모든 경우에 중요하지 않습니다. . 또한 정적 연결을 사용하면 응용 프로그램을 처리 할 수없고 종속 라이브러리는 응용 프로그램 작성자 또는 Microsoft에서 허용하지 않습니다. 예제의 경우 이 클라이언트 컴퓨터 에서이 라이브러리의 새 버전으로 실행되는 라이브러리에 정적으로 링크되는 응용 프로그램을 고려하십시오. 응용 프로그램은 여전히 의 코드를이 라이브러리의 이전 버전 인 을 사용하며 보안 향상과 같은 라이브러리 개선의 혜택을받지 않습니다. C/C++ 응용 프로그램 작성자는 종속 라이브러리에 정적으로 링크하기로 결정하기 전에 서비스 시나리오 을 통해 으로 생각하고 가능한 경우 동적 연결 을 사용하는 것이 좋습니다.
일반적으로 라이브러리에서 동적으로 링크 할 때 통화에 약간의 오버 헤드가 있습니다. 호출은 중간 테이블을 통과하며 라이브러리 자체는 읽기 전용으로 매핑되므로 모든 변수도 라이브러리 외부에 있어야합니다. 그러나 Windows의 세부 사항을 알지 못합니다. 일반적으로 오버 헤드는 무시할 만하며 동적 연결을 선택하는 것이 훨씬 좋습니다. 코드 재사용 및 보안 구멍이있는 라이브러리를 업그레이드 할 수있는 기능. –
[정적 연결 대 동적 연결] 가능한 중복 (http://stackoverflow.com/questions/1993390/static-linking-vs-dynamic-linking) – Arnaud