c++ try { } catch () 에서 try 문안에 코드가 많이 들어있으면 수행성능이 떨어지나요?

trymp의 이미지


C++ 에서 try { } catch() 문으로 예외처리를 하는데

try 문에 많은 코드라인이 들어가게 되면 수행성능이 떨어지는지 궁금합니다.

컴파일러가 어떤 처리를 할지 궁금해서요.

c++ 고수님들 답변 좀 부탁드립니다.

익명 사용자의 이미지

예외 처리를 위해서 코드 하나 실행할때마다 뭘 체크하고 그러지는 않습니다.
C++ 예외 처리는 단순히 try 문 내에서 throw 가 일어날 때 catch 로 넘기는 작업 뿐입니다.
throw 가 없다면 오버헤드는 전혀 없습니다. 다만 try 진입, 종료 시에는 특정 작업을 하기는 합니다.
(물론 그걸로 성능상 문제 생길 일은 거의 없고, 한줄마다 try{ } 로 감싸지않는 한 문제 없습니다.)

Windows 의 SEH 도 함수 콜에서 시작시에 간단한 한 두줄의 어셈블리 명령 뿐, 명령어 실행마다
무슨 특정한 작업을 하거나 하진 않습니다.

jick의 이미지

일단 제가 아는 것은 일반론이며 실제 코드에서 재보지 않으면 큰 의미가 없다는 말씀을 드리고...

try 문 안에서 많은 코드를 수행한다고 특별히 느려질 이유는 없습니다. 그런 얘기는 들어본 적이 없네요.

그보다 더 중요한 건 throw를 자주 하느냐 아니냐겠죠. (x86 linux 기준으로) C++에서 현재 사용하는 exception 구현방식이 "exception이 걸릴 때 좀 시간이 걸려도 좋으니 exception이 발생하지 않을 때의 속도를 최대한 빠르게 만들자."이기 때문에 throw가 자주 일어날 만한 코드면 아예 throw 대신 에러 코드를 돌려줘서 값을 검사하는 게 더 빠를 수도 있습니다.

* 다시 한번 말씀드리지만 어디까지나 일반론이고, 실제로 돌려 보기 전에는 모릅니다.

yhsuk의 이미지

관련하여 어느 분이 테스트하셨던 내용이 있는 링크입니다.
따라해 보진 않았습니다. :)

http://yesarang.tistory.com/371

Signature :) - "여유를 갖고 행동하되 게을러지지 말자"

twinwings의 이미지

이런 부분에서의 성능은 크게 신경 쓰시지 않으셔도 된다고 생각합니다.

아니, 신경 쓰면 안된다고 생각합니다. 이 부분의 성능은 컴파일러의 영역이니까요.

프로그램 로직이 동일한데 단지 코드의 위치에 따라 성능이 달라진다?

이건 컴파일러가 잘못 구현된 것이겠죠.

덧붙이자면 try-catch의 성능저하는 대부분 stack wind-up 때문에 생기는걸로 알고 있습니다.

마지막으로 검색해보니
draft Technical Report on C++ Performance
http://www.open-std.org/jtc1/sc22/wg21/docs/TR18015.pdf

어마어마한 물건이 있네요.(이름만 보면 std::tr1과 관련있는 물건인것 같네요)
물론 읽어보진 않았습니다 ^^;

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.