C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[24904] Re:Exception 이 Java나 C# 보다 Native 코드가 더 느리다???
빌더(TWx) [builder] 6267 읽음    2014-10-07 12:57
bugfree 님이 쓰신 글 :
: Google 개발자들은 네이티브 코드로 프로그램 개발할 때는
: Exception이 Java나 C# 보다 느리기 때문에 Exception을
: 사용하지 않는다고 하더군요
:
: 이에 대한 구글 오피셜 문서도 있던데 제가 알고있는
: 지식으로는 이해가 안됩니다
:
: VCL 라이브만해도 Exception을 거의 밥먹 듯이 곳곳에서
: 무지하게 많이 쓰고있잖아요
:
: 내노라는 실력을 갖고있는 구글 개발자들이 헛소리 하는건
: 아닐텐데요
:
: 어떻게 Exception 코드가 네이티브 보다 Java나 C#이 더
: 빠른건지 이해가 전혀 안되네요
:
:


예외가 네이티브 코드가 더 느릴 수 밖에 없는 건 32비트의 경우에는 맞는 말입니다.

예외라는 건 프로그램 실행중 어떤 비정상적인 상황이 발생했을 때, 호출구조가 깊은 것과 상관없이 예외를 캐치하고 있는
지점까지 Execution Flow를 쉽게 되돌릴 수 있는게 가능하도록 하는 메카니즘이고 이때 Unwind 구조를 이용하게 되죠.

가령 A라는 펑션블럭에서 throw로 예외를 던졌다고 할때, A가 아무리 여러단계의 호출을 거쳐 실행되었더라도
A를 호출한 어떤 함수가 try..catch 블럭을 갖는 리프 펑션이라면 Unwind 구조를 이용해서 Execution Flow를 리프 펑션으로
단번에 되돌릴수 있는 그런 구조이죠.

프로그램이 정상적으로 실행된다면 예외가 발생할 일도 없는 건데, 네이티브 코드는 예외가 발생되지 않는 정상적인 경우에도
예외 Exception Frame을 셋업하기 위한 프롤로그/에필로그 코드가(컴파일러에 의해서 생성된) 예외를 다루는 모든 함수에서
무조건 실행되어져야 합니다.

그러나 64비트 SEH 방식에선 예외처리에 필요한 Unwind 데이타를 실행파일 섹션에 별도로 두고 있기 때문에
32비트의 경우와는 달리 예외가 발생하지 않는 경우에도 프롤로그/에필로그 코드가 무조건 실행되어야 하는 조건이 필요가
없어 집니다. 예외가 발생했을 때... 실행파일의 Unwind 테이블 섹션 정보를 참조하면 그만인 거죠.
여기서 Unwind 데이타에는 함수의 시작주소/끝나는주소, language padding data등의 정보가 포함되어 지고요.

컴파일러가 try...catch 또는 try...finally ... syntax를 지원하고 64비트 실행파일을 만들수 있다고 해서 64Bit SEH가
무조건 지원되는 것은 아니고, Unwind 태이블의 섹션 생성 등 링커도 역할을 해야 하기 때문에 프론트엔드/벡엔드 모두
64bit SEH를 지원할 경우에만 이런 메카니즘이 가능 합니다.

많이들 사용하는 C#을 예로 들어 보죠.

C#의 경우 (엄밀하게는 닷넷) 결국 실행되는 코드는 Jitter에 의해서 컴파일된 네이티브 코드니까 예외가 일어나든 아니든
실행되는 코드는 네이티브 실행파일과 다를 바 없지만...

CLR Execution 엔진이 64bit SEH와 마찬가지로 함수의 시작주소/끝나는 주소는 물론 ... 메타 데이타를 이용해서
language padding 정보도 이미 알고 있는 구조이기 때문에 Win32 네이티브 프로그램과는 달리 Exception Frame을 셋업 하기
위한 코드가, 다시 말해서 예외가 발생하지 않는 정상적인 경우에도 무조건 실행되어져야 하는 프롤로그/에필로그 코드가 닷넷에선
전혀 필요가 없게 되는 거죠.

네이티브 컴파일로는 불가능한, 닷넷이 갖고 있는 장점은 이것 말고도 여러가지가 있는데 답변이 길어질거 같아서
이만 줄입니다.

bugfree [bugfree]   2014-10-07 14:01 X
기술적인 배경지식 없이 Native면 무조건 빠를 거라고
단정 부터 짓고 생각하는 제 자신이 부끄럽습니다
이해하는데 많은 도움이 되었습니다
bugfree [bugfree]   2014-10-07 14:44 X
C#은 링커가 없어서 unwind 섹션을 따로 만들수 있는
것도 아닌데 어떠케 clr이 함수들의 시작주소 끝나는
주소를 알수 있는건가요???
빌더(TWx) [builder]   2014-10-07 16:23 X
CLR Execution 엔진이 Jitter와 연동해서 동작하니까 함수들의 Start/End 주소는 물론 코드의 사이즈 까지 당연히 알수 있는 구조이기 때문에
프로그램 실행시 호출되지 않는 코드는 지트 컴파일을 할 필요도 없고, 이런 정보를 이용해서 한줄의 어셈블리 코드로 런타임 중에 코드 블럭을
이동할 수도 있기 때문에 페이지 프레임을 Compact 하게 사용할 수 있어서 프로그램의 Working Size를 줄이는 것도 닷넷에선 가능하게 됩니다.

바빠서 이만...




bugfree [bugfree]   2014-10-08 11:12 X
안드로이드에서 Java가 빠른거도
설명해주신 것과 같은 맥락으로 이해하면 되겠군요
대단히 감사합니다
김모씨 [testcode]   2014-10-10 12:51 X
안드로이드에서 자바가 빠른 건 첨 듣네요 -;; 좀 더 자세한 링크 공유 가능하실지요?

+ -

관련 글 리스트
24901 Exception 이 Java나 C# 보다 Native 코드가 더 느리다??? bugfree 5848 2014/10/06
24904     Re:Exception 이 Java나 C# 보다 Native 코드가 더 느리다??? 빌더(TWx) 6267 2014/10/07
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.