C program 최적화에 대한 조언을 부탁드립니다.

moondance의 이미지

프로젝트 마지막에서 속도에 대한 최적화를 올리려 합니다.
이 때 사용되는 테크닉으로 무엇이 있을까요?

Profiler를 사용하여 호출 빈도가 높은 놈에게 적용하려고 합니다.
이 때 assembler level로 떨어뜨린 후 최적화를 하기 보다는 C level에서 최적화를 하려 합니다.

물론 compiler에서 recommend하는 바가 있지만 이에 독립적으로 사용될 수 있는 방법이나 서적을 추천해 주시면 감사하겠습니다.

dudungsil의 이미지

질문이 너무나 추상적인것 같아서 일반론적인 답변밖에는 할수가 없네요.

일단 프로파일러를 통해서 확인해 보셔야 할것은 호출빈도가 많은 것을 찾는게 아니라 의외의 결과를 보여주는 녀석을 찾아야 합니다. 프로그램을 직접 제작하셨다면 프로그램이 어찌 돌아가는지는 거의 알고 계시다고 봐야죠.

어떤게 많이 호출되는지 시간의 대부분이 어디서 소모가 될지 이미 알고 계실겁니다. 그러한 예상과 다른 부분을 찾으셔야 합니다. 일단 그런부분들은 잘못 만들어졌을 확률이 큰 부분입니다.

먼저 그런 부분들을 제거/수정하시고, 그다음에는 많이 호출된 부분(많이 호출됐다고 시간이 많이 걸리는건 결코 아닙니다)이 아니라 가장 많은 시간을 소모한 부분을 찾고 그 원인을 파악하셔야 합니다.

대부분의 경우에 어셈블러수준까지 내려가는건 거의 의미가 없습니다. 나중에 유지보수까지 생각한다면 미친짓이죠(어셈블리 잘하는 사람 보기 힘듭니다). 상황에 맞는 적절한 알고리즘과 꽁수를 찾아내는게 가장 좋은 방법입니다.

어떤 분야인지 모르겠지만 위의 두가지 방법 (의도하지 않은 행동 제거/알고리즘 개선)으로 거의 원하는 바를 달성할수 있습니다. 그 이상이 필요하다면 그때부터는 일반론을 넘어서게 되겠죠.

산넘어 산

redbaron의 이미지

moondance wrote:
프로젝트 마지막에서 속도에 대한 최적화를 올리려 합니다.
이 때 사용되는 테크닉으로 무엇이 있을까요?

Profiler를 사용하여 호출 빈도가 높은 놈에게 적용하려고 합니다.
이 때 assembler level로 떨어뜨린 후 최적화를 하기 보다는 C level에서 최적화를 하려 합니다.

물론 compiler에서 recommend하는 바가 있지만 이에 독립적으로 사용될 수 있는 방법이나 서적을 추천해 주시면 감사하겠습니다.


가독성을 희생하고 macro 랑 goto 문을 사용하시면 어느정도 최적화에 성공할 수 있습니다.(관련된 도서를 찾아보시는 것도 좋겠지요..)
pynoos의 이미지

system call tracer 등을 이용하여 불필요한 system call이 많은지 확인해보는 것도 좋습니다.

대개 Disk I/O에서 시간이 많이 들어갑니다.

saxboy의 이미지

위에서 좋은 말씀들을 해주셨네요.

어플리케이션의 종류에 따라 다르지만, 크게 효과를 보시려면 disk I/O쪽과 시간을 많이 사용하는 함수 몇군데만 고쳐주시면 됩니다. 함수의 호출구조 개선을 위해 inline (또는 매크로함수)을 사용하는 것이나, and/or의 계산순서를 이용한 if 처리, * 를 shift 로 바꾸는 것 같은 비교적 잘 알려진 최적화 테크닉 몇가지의 효과는 몇백만번씩 호출되는 경우가 아니라면 성능을 체감하기가 거의 불가능합니다. 게다가 이정도는 요즘 컴파일러들이 워낙 좋으니 옵션만 잘 주면 알아서 해주는 경우도 많지요.

크게 효과를 보셔야 한다면 i/o가 일어나는 레벨을 좀 더 빠른 것으로 바꾸거나( 예를 들면, disk에서 처리할 놈들을 메모리에서 처리하거나, 네트웍 i/o가 있는 부분을 메모리캐쉬로 바꾼다거나...) , search가 많이 일어나는 부분의 인덱스를 효율적인 것으로 개선하거나 하는 정도가 아닐까요.
또는 반복되는 계산이 많은 루틴이 있다면 이 부분만 머리를 짜내 새로 코딩을 하는 것도 도움이 됩니다. 예를 들면 arm 에서 멀티미디어 코덱의 FFT, DCT루틴따위를 fixed point 로 바꾼다거나 하는 식으로...

profiler 를 작동시켜보면 이렇게 시간이 많이 소요되는 부분은 바로 눈에 나타나게 됩니다. profiler에서 바로 눈에 띄지 않았다면 실행하면서 exec-path를 제대로 짚어가지 않았거나, 체감할만한 최적화는 힘들다거나 한 경우가 많습니다. 그러면 컴파일러 최적화 옵션을 연구해보시는 것이 조금 더 빠를 수도 있겠습니다. 최적화 옵션을 연구하다보면 코드 자체에서 최적화할 수 있는 여지에 대한 아이디어를 얻을 수 있는 경우도 많지요.

NeoTuring의 이미지

Design 개선 -> 알고리즘 개선 -> code 개선

앞의 두 단계를 무시하고 code 개선만 한다고 하면 그 효과를 기대하긴 힘들겁니다. 하긴 프로젝트 막바지에 앞의 두단계를 수행하기엔 무리가 있겠군요. 하지만 또 그만큼 기대할것도 없을것 같군요.

댓글 달기

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