printf을 사용할때 딜레이 되는 시간을 최소화 하기

paeksj98의 이미지

개발이 어느정도 되고 나니 이제 속도가 느려서 문제가 되고 있네요.

printf와 qDebug(qt) 두가지를 쓰고 있는데 두개의 디버그를 빼면 한번퀴 도는데 대략 120ms가 걸리고

디버그를 모두 넣으면 200ms정도 걸리네요.

이상적은 속도는 100ms에 한바퀴 도는게 가장 이상적이긴 한데 120ms 정도도 봐줄만 합니다.

제품을 양산해서 판매를 하는시점에도 두개의 디버그는 뺄수가 없습니다.

이유인즉슨 산업용 단말기를 만드는데 기술이 하루게 다르게 발전하다보니 단말기가 따가가지 못해 쓰다보면 문제가 생기는데 이문제를 소비자 혹은 딜리가 디버깅을 해서 보내주기 때문에 디버깅 기능은 들어가야 하는데 시간때문에 문제가 되네요.

디버깅으로 날라간 80ms 를 찾을수 있는 방법이 있나요. 디버그를 혹시 쓰레드로 돌려서 쓰레드에서 실행하면 시간이 단축되나요..??

간단한 조언이라도 부탁드립니다.

taeyeung의 이미지

님께서 printf 함수를 사용하시는 환경이 시리얼 통신 같은 곳으로 출력해 주는 것인지 어떤지는 잘 모르겠습니다.

1번째 조언은 디버깅 메세지를 메모리에 쓰는 시간과 물리적인 매체에 쓰는 시간을 분리해 보시라고 권하고 싶네요.

일반적인 출력 방식이 메모리에 쓰고 물리적인 메체에 쓰고를 반복하는 방식이라면

메모리에 10번 쓰고 물리적인 메체에는 10개의 내용을 한 번에 기록하는 방식을 사용하는 겁니다.

2번째 조언은 printf를 간단한 버전으로 님께서 직접 만들어도 되지 않을까 합니다. 표준 라이브러리의 기능이 다 필요한 것이 아니라면

직접 이 함수를 구현해도 될 듯합니다. 인터넷에 찾아 보시면 임베디드용으로 사용하도록 경량화된 구현 함수가 있을 듯 합니다.

도움이 되었으면 합니다.

라스코니의 이미지

100 ~ 120ms 정도 걸린다면 한번 실행 우선순위를 올리고 측정해 보세요.
윈도우라면 작업 관리자에서 몇 % 정도 차지하는 가 보시고, 10 % 이내라면 30 % 정도까지 실행 우선순위를 올려서 도달하는지 보시고 그래도 100 ms 언저리에서 노는지 보세요. 리눅스라면 renice 명령으로 조정가능합니다.

우선순위 조작으로도 안된다면 taeyeung 님 이야기대로 최하위 priority를 가진 디버그 버퍼 태스크를 만들어서 실시간으로 프린트하는 대신 시간이 남을 때 화면에 출력하는 방법을 쓰시면 됩니다.

아니면 메모리가 충분하다면 버퍼에 다 저장하고 실행이 종료되고 난 후 최종에 파일로 저장하는 방법도 있지요.

paeksj98의 이미지

알려주신 방법들을 적용해서 테스트해봐야 겠네요.

print문으로 serial로 내보내는데 생각 했던것 보다 시간이 많이 걸리니 이런것 까지 하네요...

bestyt의 이미지

ARM환경에서 개발중이시라면 2가지를 추천해드리고 싶네요.

1. printf문의 parameter수를 3개 이하로 줄인다.
ARM의 architecture구조상 함수콜을 할때 parameter가 3개 이하이면 register에 넣고 함수 콜을 할수있지만, 그 이상의 parameter가 들어올시에는 stack에 넣고 콜을 하게됩니다. register에 넣고 함수콜이 stack에 넣고, 함수안에서 복원하는것보다 훨씬 빠르기 때문에 속도가 중요시 된다면, printf문에서 parameter수를 3개 이하로 유지하세요.

2. printf문이 필요해 컴파일시에 꼭 들어가야 하는거면, runtime시 필요할때만 키고 필요없을때엔 끄는 방법이 있을수있겠네요.만약 debug()문안에서 printf를 하게된다면,
void debug(...) {
if (DEBUG is ON)
printf(...);
}
}
와 같이 해두고 printf문 호출시 debug문을 호출하면 필요시에만 printf이 호출되고, 나머진 나오지 않게되니 효율적일듯하네요. DEBUG를 트리거 하는건 동적으로 환경셋팅파일이나, system enviorment에 넣어두면 될듯합니다.

pastime의 이미지

말씀하신 내용은 일반적인 함수에 대해서는 적용할 수 있겠지만
printf()와 같이 가변인자를 받는 함수에서는 해당되지 않을 것입니다.

함수의 구현이 하나인 이상 인자를 받을 때 스택을 이용할지 레지스터를 이용할지
컴파일 시점에 결정이 되어야 하고 printf의 경우 몇 개의 인자를 받을지 정해지지 않은
상태이므로 스택을 이용하도록 구현되어 있는 상황에서
호출하는 쪽에서 이를 섞어서 쓰면 정의되지 않은 행동이 수행될 것 입니다.

bestyt의 이미지

네 생각해보니 가변인수인경우엔 의미가 없겠네요.

printf함수를 eprintf와 같이 새롭게 정의해서 fixed된 parameter를 받도록 해야 적용가능할듯하네요.

http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/C/Documents/COptimization#s-7

댓글 달기

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