[질문] 코드양을 증가 또는 if문의 추가 과연 어떤게 좋은 코딩

winicon의 이미지

안녕하세요.

코딩을 하는 중에 코드상에 아래와 같은 경우가 생겼습니다.

test()
{
  a_function(true);
}

a_function(bool flag)
{
   while()
   {
     .....
     .....
     if ( flag == true )
       {
         .....
         .....
       }
     ....
     ....
   }
}

a_function()함수는 한번의 호출로 while문은 최소 50번 이상 반복 합니다.

코드양을 증가(같은 코드 b_function()함수를 추가하고 if문을 제거함)
또는 if문의 추가 과연 어떤게 좋은 코딩 스타일 인가요?

그럼 많은 의견 부탁 드립니다.

새해 복 많이 받으세요. ^^

whatisid의 이미지

a_function에서 if 부분만 빠진게 b_function 이란 말씀이신거죠?
그건 별로 좋지 않을 것 같습니다.
if 밖의 코드에 수정이 생긴다면 a_function과 b_function을 모두
고쳐줘야 하지 않을까요?

저라면 첫째, 그냥 위의 코드처럼 if로 하거나 ,

둘째, 아니면 a_function이 복잡하다면
a_function을 above_if_function, if_function, below_if_function으로 나누고
a_function은 above_if_function,if_function,below_if_function을 수행하도록,
b_function은 above_if_function, below_if_function를 수행하도록 하겠습니다.

물론, 만드신 내용에는 안 맞을수도 있겠습니다만^^;;; 일반적으로 봤을때
이렇게 할수도 있다는 겁니다. ^^;

winicon의 이미지

좋은 답변 주셔서 감사합니다.
a_function에서 if 부분만 빠진게 b_function 이란 말씀이신거죠?
=>네 맞습니다.

그런데 그렇게 하면 함수 호출로 인한 부하가 많을것 같은데 상관은 없나요?

Necromancer의 이미지

inline function을 쓰는 것도 하나의 방법이 될 수 있죠. 컴팔할때 inline
function은 호출되는 위치마다 코드가 같이 들어가버리니까요.

하지만 요즘 컴파일러들은 inline을 무시하는게 보통이라서

gcc의 경우 gcc 매뉴얼을 자세히 안읽어봐서 모르겠네요.

Written By the Black Knight of Destruction

서지훈의 이미지

편리와 포퍼먼스 문제인거 같은데...
요즘은 워낙 성능이 좋으니...
다들 편리 쪽으로...

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

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

progcom의 이미지

조건문이 무지무지 복잡한 연산을 필요로 하는 경우나, 혹은 정말정말 스피드가 정말로 무지무지 중요하다면 분리해야겠지요.

flag == true ... 로 분기하는 것이라면 그냥 써도 크게 차이나 나지는 않을 듯 싶네요.

죠커의 이미지

그렇게 중요한 부분이라면..

inline해보시구요. 진짜 inline되었는지 확인해보세요.
inline 키워드는 inline을 보장하지는 않거든요.

테스트 해보시는 것 밖에 없을 듯 합니다.

sangwoo의 이미지

궁금한 사항이 하나 생겼는데..
inline이 항상 빠른 실행결과를 보장해 주지는 않을거 같다는 생각이
들었습니다. 일단 code duplication이 생길 가능성이 크므로, 오브젝트
파일의 크기가 증가함으로서 생기는 negative effect도 있을 텐데요.
(실행시간이 오래걸린다거나..)

어떤 경우에 inline을 쓰는 것이 좋다, 혹시 이런 지침 같은건 없을까요?

----
Let's shut up and code.

nthroot의 이미지

보기 좋은 코딩이 잘된 소스라고 생각되는군요.

제 생각엔 말입니다^^;

------식은이 처------
길이 끝나는 저기엔 아무 것도 없어요. 희망이고 나발이고 아무 것도 없어.

Necromancer의 이미지

sangwoo wrote:
궁금한 사항이 하나 생겼는데..
inline이 항상 빠른 실행결과를 보장해 주지는 않을거 같다는 생각이
들었습니다. 일단 code duplication이 생길 가능성이 크므로, 오브젝트
파일의 크기가 증가함으로서 생기는 negative effect도 있을 텐데요.
(실행시간이 오래걸린다거나..)

어떤 경우에 inline을 쓰는 것이 좋다, 혹시 이런 지침 같은건 없을까요?

네 그렇습니다. 아무데서나 쓰면 코드 덩치만 커지죠. 그때문에
아무데서나 쓰는건 아닙니다.

가장 많이 추천하는 경우는 몇 줄 안 되는 짧은 함수를 사용하는 경우이고요.
(이경우 진짜 함수로 만들면 call overhead가 함수 실행시간에 비해 길죠.)

물론 몇 줄이 아닌 한줄짜리 함수같은 경우는 #define으로
매크로 하나 만드는게 훨 낫죠. #define으로 하기도 거시기한 길이일
경우에나 쓰지. 요새는 inline을 직접 다는거는 거의 못 보네요.
컴파일러가 다들 알아서 처리한다고.

그리고 아주 가끔가다 호출되는 함수나 특정 몇 안되는 부분에서(특히 한군데서만) 호출되는 함수들도
inline이 유리한 경우가 많습니다. 프로세서 성능에 악영향을 미치는 pipeline hazard의
발생원을 줄이기 때문이죠. (모든 점프나 call 명령어는 hazard를 발생시킬
수 있죠.)

Written By the Black Knight of Destruction

windy96의 이미지

sangwoo wrote:
궁금한 사항이 하나 생겼는데..
inline이 항상 빠른 실행결과를 보장해 주지는 않을거 같다는 생각이
들었습니다. 일단 code duplication이 생길 가능성이 크므로, 오브젝트
파일의 크기가 증가함으로서 생기는 negative effect도 있을 텐데요.
(실행시간이 오래걸린다거나..)

어떤 경우에 inline을 쓰는 것이 좋다, 혹시 이런 지침 같은건 없을까요?

그럼 지침은 존재하지 않습니다. 왜냐하면 컴파일러마다 cpu마다 그리고 프로그램의 종류마다 다르기 때문이죠.
예를 들어, branch에 대한 cost가 큰 architecture라면 당연히 inline이 있으면 유리합니다. 하지만 cache가 크다면 또 inline이 유리하다고만 할 수 없습니다.
arm의 compiler는 inline을 잘 이용하지 않습니다. 그건 arm의 architecture에 inline이 불리하다고 판단하는 것이지요.

프로그램의 종류마다도 다릅니다.
앞에서 처음 분이 올리신 코드도.. 그 계속 실행되는 hot spot이 짧은 시간동안 반복해서 실행되는 것이라면 inline을 안 쓰는 것이 유리할 것이고, 반복하는 블럭이 굉장히 크다, 이렇다면 inline이 더 유리할 수 있습니다. 지금 이 이야기는 cache size와 cache replacement policy에 따라서 정반대가 될 수도 있겠지요.

요는 프로그래머가 알아서 잘 판단해야 한다는 것이고..
아주 low-level하거나 time-critical한 부분이 아니라면 그냥 compiler가 하자는 대로 맡기면 됩니다. 도저히 그냥은 성능이 안 나오는 경우에 한해서 분석을 하고 고민을 해야 하고, 그 경우에는 architecture나 compiler에 대한 이해가 필수라고 하겠습니다.

cdpark의 이미지

정 성능이 의심스러우면 a_function만 고치면 되는 것 아닌가요?

a_function(bool flag) 
{ 
   while() 
   { 
     ..... 
     ..... 
     if ( flag == true ) 
       { 
         ..... 
         ..... 
       } 
     .... 
     .... 
   } 
}

대신

a_function(bool flag) 
{ 
   if (flag == true)
   {
      while() 
      { 
      ..... 
      ..... 
      }
   }
   else
   {
      while ()
      {
      .....
      .....
      }
   }     
}
cheezy의 이미지

Time Complexity을 고려하는 것이 알고리즘 성능평가의 주요한 방법이죠. ^^;

Worst Case를 고려해 보심이 좋을 듯 싶군요.

Found Myself.

댓글 달기

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