if 문과 switch문중 어느게 더 효율적일까요?

toy의 이미지

if
else if
else if
....

과 switch문중 어느게 더 좋은가요?
코드의 가독성은 switch문이 높은것같은데....
더 효율적일까요? :oops:

lsj0713의 이미지

쓸 수 있다면 당연히 switch 문 쪽입니다. 여러가지 조건에 따라 달라지겠지만, switch 문은 if ... else if ... else if 가 아니라 테이블을 만들어 해당위치로 바로 이동하도록 최적화될 수 있습니다.

opt의 이미지

일부 코드에서의 부분 최적화가 전체 퍼포먼스에 미치는 영향은 극히 미미합니다.

알고리즘과 자료구조, 아키텍쳐 측면의 결정에서 효율적인 아키텍쳐를 선택하는 것이 오히려 전체 퍼포먼스에 critical 한 영향을 미칩니다.

----
LUX ET VERITAS | Just for Fun!

ssehoony의 이미지

컴파일러가 별도의 최적화를 하지 않는 상태에서는
if else 가 switch 보다 빠르다고 합니다.
switch 의 문법 특성을 보면 if else 보다 느릴 수 밖에 없는데요
가령

case a:
break;

case b:
break;

만 사용하는게 아니고

case a:
case b:
break;

이런게 가능해서 이걸 구현하다보면 if else 보다 느려지는 것 같더군요.

하지만 case 문 뒤에 오는 조건이 규칙성이 있다던지 하면 컴파일러가
switch 에 대한 최적화를 해서 if else 보다 더 빠를 수도 있다고 하더군요

sjpark의 이미지

devilhero wrote:
case a:
case b:
break;

이런게 가능해서 이걸 구현하다보면 if else 보다 느려지는 것 같더군요.

이 부분이 이해가 안되는데요?

ㅡ,.ㅡ;;의 이미지

devilhero wrote:
컴파일러가 별도의 최적화를 하지 않는 상태에서는
if else 가 switch 보다 빠르다고 합니다.
switch 의 문법 특성을 보면 if else 보다 느릴 수 밖에 없는데요
가령

case a:
break;

case b:
break;

만 사용하는게 아니고

case a:
case b:
break;

이런게 가능해서 이걸 구현하다보면 if else 보다 느려지는 것 같더군요.

하지만 case 문 뒤에 오는 조건이 규칙성이 있다던지 하면 컴파일러가
switch 에 대한 최적화를 해서 if else 보다 더 빠를 수도 있다고 하더군요

switch 를 사용할수 있다면 사용하는것이 훨씬 효율적입니다.


----------------------------------------------------------------------------

체스맨의 이미지

Orion Project : http://orionids.org

ssehoony의 이미지

다음은 뭔가 이상하지만 c 문법상 switch 문 사용에 위배되지 않은 문법입니다.
역시 그렇기에 컴파일도 잘 되네요.

#include <stdio.h>
#include <stdlib.h>

int main(int argNum, char* argStr[])
{
        int a = 10;
        int type;

        if(argNum == 2)
        {
                type = atoi(argStr[1]);
                if(type < 1 || type > 2) type = 1;
        }

        switch(type)
        {
                case 1:
                        if(type == 1)
                        {
                                int a = 15;
                                int b = 20;
                                printf("a[%d] b[%d]\r\n", a, b);

                        case 2:
                                printf("hello! a[%d] b[%d]\r\n", a, b);
                        }
        }

        printf("a[%d]\r\n", a);

        return 0;
}

위의 코드를
gcc 3.2 에서 컴파일해서 실행한 결과가

Quote:

./a.out 1

a[15] b[20]
hello! a[15] b[20]
a[15]

Quote:

./a.out 2

hello! a[134513258] b[-1073749352]
a[15]

이런 코드는 깔끔하게 처리가 안된는 군요.
이런 부분을 runtime 때 적당히 보정하는 작업이 있다면
switch 문이 if else 보다 느려지겠지만 이런게 없다면
딱히 switch 문이 느릴 이유가 없을 것 같긴 하군요.

위와 같은 코드에서는 case 2 일 경우는 어떻게 작동하는게
올바른 작동일까요?

서지훈의 이미지

Quote:
switch() instead of if...else...
For large decisions involving if...else...else..., like this:
if( val == 1)
dostuff1();
else if (val == 2)
dostuff2();
else if (val == 3)
dostuff3();
it may be faster to use a switch:
switch( val )
{
case 1: dostuff1(); break;

case 2: dostuff2(); break;

case 3: dostuff3(); break;
}
In the if() statement, if the last case is required


Ref: http://www.abarnett.demon.co.uk/tutorial.html#SWITCH
switch()이게 더 나을듯 하다는 내용입니다.
참고 하시길.

<어떠한 역경에도 굴하지 않는 '하양 지훈'>[/url]

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

vinus의 이미지

어는쪽이 좀더 효과적일지는.
gcc -S xxx.c 하셔셔, 어셈블러 코드를 비교 해 보시는 것이 좋을 듯....

>>>행복한 웃음<<<

initiative의 이미지

switch 문을 권장합니다.

switch 문 사용시에는 가급적 case X : 문에서 X 에 오는 int형 type 도 순서대로 쓰는게 보기에도 좋고 성능도 좋습니다.

With Everlasting Passion about new Tech. and Information!

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.