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

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s