정밀한 시간간격을 이렇게 얻었습니다.

leolo의 이미지

지금의 경우 정밀한 시간 간격을 구할려고 하는데요..
이거 그냥 쓰면 한가지 문제가 발생할꺼 같아서요..

etime = ( t1.tv_sec - t0.tv_sec ) + t1.tv_usec / 1000000.0;
부분에서 t1.tv_sec가 만약에 10000이고, t0.tv_sec가 10001이면
1초의 차이가 나게 되는데.. 이거 문제 없나요..
알려주세요..

float elapsed_time( struct timeval t0, struct timeval t1 ) 
{ 
    float etime; 

    if( t1.tv_sec - t0.tv_sec > 0 ) { 
        etime = ( t1.tv_sec - t0.tv_sec ) + t1.tv_usec / 1000000.0; 
    } else { 
        etime = ( t1.tv_sec - t0.tv_sec ) + ( t1.tv_usec - t0.tv_usec ) / 1000000.0; 
    } 
    return etime; 
} 

cdpark의 이미지

etime = ( t1.tv_sec - t0.tv_sec ) + ( t1.tv_usec - t0.tv_usec ) / 1000000.0;

이 식 하나면 끝 아닌가요? if 문이 왜 들어가는지 궁금합니다.

leolo의 이미지

아래 코드에 문제가 없는지요..
제가 생각하는 것인 이렇습니다.
begin.tv_sec 1059448178
end.tv_sec 1059448181
begint.tv_usec 420015
end.tv_usec 425600
이런 경우 문제를 생각해봤을 경우 아래 코드가 맡는지 알고 싶습니다.
아참.. 그리고, 이 결과는 초로 나오는게 맡는지 알고싶습니다.


#include <stdio.h> 
#include <sys/time.h> 

float calculate_execution_time(struct timeval begin, struct timeval end); 

int 
main(void) 
{ 
    struct timeval start_time, finish_time; 

    gettimeofday(&start_time, NULL);     
    sleep(3);
    gettimeofday(&finish_time, NULL); 

    printf("%f sec.. \n", calculate_execution_time(start_time, finish_time)); 
} 

float calculate_execution_time(struct timeval begin, struct timeval end) 
{
    long sec;
    float etime;
    printf("begin.tv_sec %ld\n", begin.tv_sec);
    printf("end.tv_sec %ld\n", end.tv_sec);
    printf("begin.tv_usec %ld\n", begin.tv_usec);
    printf("end.tv_usec %ld\n", end.tv_usec);
    
    sec = end.tv_sec - begin.tv_sec;

    
    if( sec > 0 ){
         etime = (sec-1) + (end.tv_usec / 1000000.0) + (1 -  (begin.tv_usec /  1000000.0));
    } else {
        etime = (end.tv_sec - begin.tv_sec) + (end.tv_usec - begin.tv_usec) / 1000000.0;
    }
    return etime;
} 

실력이 있으면 삶이 편하다... 영차 영차...

cdpark의 이미지

굳이 if 문 없이 바로
etime = (end.tv_sec - begin.tv_sec) + (end.tv_usec - begin.tv_usec) / 1000000.0;
을 돌려주면 됩니다. 무엇이 문제죠?

그리고 특별한 이유가 없다면 float 대신에 double을 사용하는 게 좋습니다. 정밀도 면이나, 기타등등의 이유로도.

mach의 이미지

cdpark wrote:
굳이 if 문 없이 바로
etime = (end.tv_sec - begin.tv_sec) + (end.tv_usec - begin.tv_usec) / 1000000.0;
을 돌려주면 됩니다. 무엇이 문제죠?

그리고 특별한 이유가 없다면 float 대신에 double을 사용하는 게 좋습니다. 정밀도 면이나, 기타등등의 이유로도.

옛날 얘기 하나 해드리겠습니다.
전제)
아득한 옛날에는 현재보다는 하드웨어 제작기술이 서툴렀고(?), 메모리 가격도
비쌌습니다.(그래도 그들은 위대했지요)
물론 하드웨어 속도도 현재와 비할바가 아니었습니다.
하드웨어의 속도를 비교하는 개념이 묘한(정착되지 않은) 시절이었습니다.
벤더별로 하드웨어 구성의 차이가 있어서 일반적인 팩터로 벤치마킹하는게 어려웠습니다.
그래서, 그때는 컴퓨터의 성능을 MIPS(초당 백만개의 명령어처리)로
표현했습니다. 그리고는, 하드웨어 기술이 보다 발달하고, FLOPS라는 단위를
사용하기 시작했습니다. FLOPS(초당 플로팅포인트연산수; 실수연산수)는
MIPS와 비교의 대상이 아니지요.
현재는 보통 GFLOPS(G=Giga)를 사용해서 성능을 표현합니다. (더 진보했나?)
참고로 10기가플롭스면 초창기 슈퍼 컴퓨터의 성능입니다.
* 성능을 측정하는 척도는 다양합니다. 제가 언급한것보다 자세한것은
다른 자료를 보셔야 할것입니다.
본론)
정수연산과 실수연산은 보통 100배의 차이를 언급합니다. 당연히 정수연산이
빠르다는 것이지요. 정수는 논리회로 구성도 단순하고, 정보표현도 단순합니다.
정수 가산기(Adder)는 논리회로에서 아주 기초에 해당하지요? 실수는?
당연하게도 연산속도도 차이가 나지요. 100배정도.
물론, 실수에 비해서요. 시간을 재는데 더 긴 시간이 걸린다면 문제겠지요? 비약하면
제로섬(Zero Sum; 한국식으로 표현하면 '배보다 배꼽이 크다'?)에 걸리겠지요.

1970년대 선각자가 왜(?) 시간을 표현할때, 구지, tv_sec, tv_usec로
나누고 각각을 long으로 표현했는지 그 이유중 하나를 짐작하셨나요?

의견)
위 코드의 특징으로 볼때는, 비교한번 더하는게 실수연산보다 빠르기
때문으로 생각됩니다. 물론, 연산 후 실수로 변환하는 과정이 있지만
전체연산과는 차이가 있겠지요.(어셈블리 코드로 바꿔 확인은 안해봤습니다 :oops: )
현재는 컴퓨터가 워낙 빨라서 문제가 되지 않을 수 있지만,
이러한 유형의 코드는 일종의 관습이지요. 악습같지는 않습니다.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

cdpark의 이미지

mach wrote:
1970년대 선각자가 왜(?) 시간을 표현할때, 구지, tv_sec, tv_usec로
나누고 각각을 long으로 표현했는지 그 이유중 하나를 짐작하셨나요?

정수형과 실수형의 차이 때문이죠. 실수형으로는 오차 없이 수를 표현할 수 없으니깐요. 단순히 long 하나로 micro second 까지 표현하면 좋겠지만, 그러기엔 금방 overflow가 발생하고요.

댓글 달기

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