C / C++ – Fast add nanoseconds to timespec structure

C나 C++ 프로그램에서 나노세컨트 단위의 시간을 처리해야 하는 경우가 간혹 있는데 이 경우에는 timespec 구조체를 사용하는 것이 적당하다.

만약 timespec을 사용하다가 특정 시점에서 몇 나노 세컨드 이후의 timespec이 필요한 경우에는 아래의 Snippet을 활용하면 된다. 워낙 짧은 시간이다 보니 시간을 더하는 연산의 속도가 매우 중요하다.

코드는 GitHub Gist – BinaryPrison 에서 참조하였다.


Sometimes you may need to handle nanoseconds in C or C++. In this case, using timespec structure is appropriate approach.

And if you need to add some nanoseconds to your timespec, this snippet below would be helpful.

The snippet is from GitHub Gist – BinaryPrison


static inline uint32_t __iter_div_u64_rem(uint64_t dividend, uint32_t divisor, uint64_t *remainder)
{
  uint32_t ret = 0;

  while (dividend >= divisor) {
    /* The following asm() prevents the compiler from
       optimising this loop into a modulo operation.  */
    asm("" : "+rm"(dividend));

    dividend -= divisor;
    ret++;
  }

  *remainder = dividend;

  return ret;
}

#define NSEC_PER_SEC  1000000000L
static inline void timespec_add_ns(struct timespec *a, uint64_t ns)
{
  a->tv_sec += __iter_div_u64_rem(a->tv_nsec + ns, NSEC_PER_SEC, &ns);
  a->tv_nsec = ns;
}
Advertisements

iOS App 개발기 (Slide)

작년 초에 App Store에 배포했던 iOS 인디 앱의 개발기를 간략하게 슬라이드로 만들었다. 전체 프로세스를 간략히 요약 정리했는데 처음으로 iOS App 를 개발하는 사람들이 전체 프로세스에 대해서 이해하는데 도움이 될 수 있었으면 좋겠다.