질문드립니다..) 100만줄의 단순 무식 code.. VS 100만개의 if 문(10만줄)

jekai의 이미지

안녕하세요... 궁금증이 하나 생겨서요..
이문제는... 오래된 프로그래밍 숙련자분들에게 요청합니다.

수행퍼포먼스에 대한 질문인데,,
만약.. 두 코드가 있습니다. output 은 같고요..

한 코드는,, 제어문 없이 각 case 별로 함수같은것을 만들어서 코드량이 엄청나다고 가정합니다.그래서
컴파일된 오브젝트파일이 1기가정도 된다고 가정합니다.

그리고 똑같은 결과를 내는 다른 코드는 각 경우마다 제어문을 쎠서 코드량이 엄청 줄였다고 가정합니다.

이 두코드중에 어떤것이 더 좋은 퍼포먼스를 낼까요?? ( 여기서 퍼포먼스는 단순 스피드 )

제 생각에는 if 문, for 문같은 제어문이 많다면..파이프라이닝이 깨지면 그만큼 손해일테고..

코드량이 많아지면( 위의 예로 1기가라 가정하면.. ) memory-harddisk 간에 swapping 이 많이 일어나서 disk IO 의 손해를
본다고 생각드는데....

고수님들.. 어떻게 생각하세요??? ㅡ.ㅜ

anfl의 이미지


"코드량이 많아지면( 위의 예로 1기가라 가정하면.. ) memory-harddisk 간에 swapping 이 많이 일어나서 disk IO 의 손해를
본다고 생각드는데...."

제 생각에는 disk IO 보다는 cache miss에서 발생하는 손실이 더 클것 같네요. application의 성격과 architecture에 따라 틀리지만 일반적인 RISC machine이라면 application size가 감소하는 비율만큼 수행 속도가 향상됩니다. cache 때문에...

질문하신 내용에서 어떤 application인지 어떤 architecture인지를 명시하지 않아 뭐라고 말하긴 힘들것 같은데 "코드량이 엄청 줄였다고 가정"한다고 했으니 저라면 size를 줄인쪽에 손을 들어주겠네요.

pipeline stage의 depth가 얼마인지, branch prediction이 있는지, cache는 어느정도 크기이고 binary의 code size는 얼마이고 memory에서 data를 가져오는데 몇 cycle이 걸리는지, 어떤류의 application인지와 같은 architecture와 application을 알지못하면 유추 자체가 매우어려운 질문입니다.

그리고 유추한다고 해도 정확하지 않을 가능성이 있습니다. 성능에 관한한 머리로 생각한것과 실제 시뮬레이션한 결과는 인간의 한계로 인해 틀린 경우가 심심치않게 발생합니다. 가장 좋은것은 직접 시뮬레이션 해보는수 밖에 없을듯 하군요.


jekai의 이미지

답변 감사합니다.

네... machine 은 sun sparc 혹은 intel 입니다. CISC machine 입니다. (sparc 도 CISC 맞던가? ㅡ.ㅡ;)

cache 를 생각안했군요... 네 맞는것 같습니다 ^^;
code 량이 엄청많으면,, cass miss 가 엄청 자주 발생하겠네요.. 거기가.. disk IO 까지.. 헐...;;

답변 감사합니다. 덕분에 다시 한번 생각할수있게 됐네요 ^^

익명 사용자의 이미지

sparc은 RISC칩으로 알고 있습니다만...

vacancy의 이미지


Disk I/O가 사실 cache miss 때문이죠.

anfl의 이미지

sun sparc 혹은 intel x86이라면 branch prediction을 제공하기 때문에 branch에 의해 pipeline이 깨어져 발생하는 비용보다는 cache miss 때문에 발생하는 비용이 클것 같네요.

동일한 기능을 하는 프로그램이 size가 극단적으로 크게 되려면 대부분 loop unroll한 code일것이고 이러한 code라면 control-flow가 branch prediction에서 taken하기 좋게 될것이기 때문입니다.

"Disk I/O가 사실 cache miss 때문이죠."

이말은 다소 비약이 있는것 같습니다. 메모리가 충분할때 demand paging을 굳이 할필요가 없다면 모든 code를 메모리에 넣고 돌릴수도 있는데 그렇게 되면 swap하지 않는한 disk I/O는 발생하지 않습니다. 물론 메모리가 충분하면 굳이 swap 할 필요도 없겠죠.
하지만 이러한 상황에서도 cache miss는 발생하죠. L1 cache의 크기는 기껏해야 1M에서 2M 사이이니깐 말이죠. 그래서 Disk I/O와 cache miss를 연관 짓는것은 관련이 없다고 할수는 없으나 다소 비약이 있다고 할수 있겠네요.


jekai의 이미지

요즘 RISC 나 CISC 나.. branch prediction 을 제공안하는게 없죠...

antibug의 이미지

1. 엄청난 코드 버전

long mul( int a, int b )
{
  switch( a )
  {
  case 0: return 0 ;
  case 1: 
    switch( b )
    {
    case 0: return 0 ;
    case 1: return 1 ;
    case 2: return 2 ;
    case 3: return 3 ;
    ....
    }
  case 2:
    ....
  }
}

2. 제어문 구조

long mul( int a, int b )
{
  long result = 0 ;
  for ( int i = 0 ; i < b ; i ++ )
    result += a ;
  return result ;
}

재미없는 일은 하지 말자는 인간 쓰레기.
-.-;

--------------------------------------
재미없는 일은 하지 말자는 인간 쓰레기.
-.-;

jekai의 이미지

보통.. 비슷한 코드를 기능별로 함수로 만들때, script 코드로 C Code 를 만들어내는데...

그렇게 만들어내니... 함수갯수가 엄청나더군요.... 약간식만 다른코든데... ㅎㅎ