2011년 2월 20일 일요일

백업] 네이버 41

[펌] [강좌] 최적화 지침 10개명 java
2004/09/03 10:59 수정 삭제
출처 『해킹.... 속임수의 예술....』 | 미스티
원문 http://blog.naver.com/zsup1343/60003941170
안녕하세요. 이번에는 최적화에 대한 항목을 10가지 항목으로 정리해 올려보았습니다.

제일 중요한 항목이 마지막 항목임을 잊지 맙시다 -_-+



프로그램최적화 지침
  이 지침서는 정수형 코딩에 알맞는 스타일이므로 부동소수연산에는
  적용이 안될수 있음을 밝힙니다.  왜냐? 부동소수점은 한두클럭에
  연산되지 못하는 명령이 많기 때문입니다 . -_-+

  1. 제일 중요한건 똘똘한 컴파일러를 써야 한다는 것입니다.
      역시 벤치마킹등으로 한번 코드최적화레벨을 확인해보시는
      방법밖에 없지요. 이게 제일 확실한 최적화입니다.
      (헉.. 돌들이.. --;;)
  2. 전역변수/포인터/함수의 사용을 자제하십시요.
      일반적으로 전역변수/함수들의 경우 현재 실행되고 있는 코드와
      상당히 떨어져 있을수가 있기 때문입니다. 지역변수의 경우
      현재 사용하고 있는 스텍에 들어있기 때문에 케쉬되어있을
      확률이 매우 큽니다.  또한 클레스내부 매소드간 사용은
      컴파일된 코드가 모여있도록 해주는데에 일조해줍니다.
  3. 컴파일러마다 틀리지만 되도록 상수를 많이 이용하시고
      C++등 고급언어들의 경우 레지스터 조작을 삼가해주십시요.
      상수를 쓰면 변수제어할 일이 없어 당연히 빨라집니다.
      혹시 속도의 증가를 위하여 레지스터변수나 레지스터를
      사용하십니까?(고급언어에서)  참으십시요. 해당루틴을
      100%어셈블리로 만드신다면, 얼마든 그렇게 하셔도
      상관 없지만 고급언어 실행줄 사이사이에 사용하는
      레지스터 사용문은 가뜩이나 최적화 하는데에 레지스터가
      부족하여 골머리를 썩게하는 컴파일러한태 매우 잔인한
      짓을 하게 되는겁니다. 당신이 사용한 레지스터 하나가
      컴파일러에게 그 래제스터를 보호하기 위하여 몇배의
      오버해드를 발생시킨다는것을 유의하십시요.
  4. 간접호출을 피하십시요.
      이 이야기가 무슨뜻인지 이혜가 안가시는 분은 제가 얼마전
      올렸던 팬티엄 2/3의 브렌치유닛이란 문서를 보시기 바랍니다.
      그곳에서 "동적인 브렌치"부분을 보시면 왜 간접호출등이
      최적화에 쥐약일수밖에 없는지 아시게 될것입니다.
      하지만 불행히도 클레스및 com의 사용은 간접호출의
      전형적인 예입니다.  가뜩이나 클레스의 사용으로
      동적인 브렌치가 유발되어 cpu성능을 떨어뜨릴수 있는데
      프로그래머인 당신마저 클레스 이외의 동적인 브렌치를
      시도하신다면 cpu는 당신이 원하는 만큼 빨리 움직여주지
      않을것입니다.
      그렇다고 클레스가 나쁘다는 말은 아닙니다. 클레스는
      브렌치 예측에는 나쁜 영향을 끼치지만 케슁에는 좋은 영향을
      끼칩니다.
  5. 최대한 SIMD 기능을 활용하십시요.
      SIMD가 뭐냐구요? 쉽게 말해 MMX나 XMM 등을 사용하라는 뜻입니다.
      어랏? 그럼 어셈블리를 필히 써야 겠군요.  아닙니다. 요즘은
      이런 기능 사용하는 라이브러리도 꽤 나와있습니다.
      물론 제일 좋은것은 어느정도 어셈블리를 섞어 쓰는것이겠지요.
  6. 레지스터/변수를 쪼개는 일을 삼가해 주십시요.
      이게 무신 말이냐.. 일반적으로 팬티엄등의 32비트 cpu에
      레지스터들은 32비트입니다. 이들 32cpu한태 16비트데이터
      (short , word)를 다루라는것은 16비트 절환 명령을 요구하게
      되므로 코드사이즈의 증가와 오버헤드도 생기게 됩니다.
      최대한 32비트를 32비트 답게 써주십시요.
      단 byte 단위의 경우 워드단위보다는 좀더 낳습니다.(80x86의 예입니다.)
  7. byte / struct align을 적극 활용하십시요. 이말이 무었이냐?
      어셈블리 코더들에게는 직접 소스파일별로 지정을 해주셔야
      하므로 잘 알고계실 변수 정렬입니다. 예전에 올렸던 글인
      "메모리 복사의 미학"에서 보셧던것과 마찬가지로 정렬된
      주소의 변수들은 하드웨어에게 많은 사랑을 받게 됩니다.
  8. 간결하고 잘 정렬된 명령들은 케쉬미스및 브렌치로 인한 어버해드를
      최소화 해줍니다.  무슨말인고 하니 코드의 크기가 작을수록
      케쉬가 잘되는건 당연하고, 브랜치 예측 유닛도 잘 동작한다는
      뜻입니다.
  9. 코드가 들어있는 영역의 데이터를 수정하지 마십시요.
      종종 flat 모드의 프로그래밍에서 코드중간에 변수를 삽입하여
      읽기/쓰기가 가능한 스타일이 대표적인 예입니다만, 이는
      수정이 될 일이 거의 없다는 전제하의 코드케쉬/브렌치 시스탬에게
      매우 큰 부담이 됩니다. 따라서 코드내부에 변수를 만드는건
      매우 않좋은 일입니다.
  10.마지막으로 제일 중요한 사안입니다.
      오프라인 스터디에 자주 참가하여 주제발표를 잘 합시다.
      후닥닥..(돌날라오는거 피하는중)

  이로서 최적화 10계명이 채워졌습니다. 위 사안은 인텔사에서 권장한
  최적화 기준을 참고로 한 자료입니다. (맨 밑줄 빼고.. ^^a)
  그럼 수고하세요 ^^/ 

댓글 없음:

댓글 쓰기

국정원의 댓글 공작을 지탄합니다.

UPBIT is a South Korean company, and people died of suicide cause of coin investment.

 UPBIT is a South Korean company, and people died of suicide cause of coin. The company helps the people who control the market price manipu...