From 8cf036a49d6a5bee901b7dd8b30ba905183134ca Mon Sep 17 00:00:00 2001 From: Pierce Lopez Date: Tue, 29 Sep 2015 19:45:22 -0400 Subject: [PATCH] nsqd: optimize NewGUID() division for "milliseconds" 64-bit division operations appear to be slow on some ARM systems, so replace division by 1000000 with a bitshift equivalent to division by 1048576. adapt guid twepoch comment for revised guid timestamp scheme --- nsqd/guid.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/nsqd/guid.go b/nsqd/guid.go index 168ddf693..0fa5823a1 100644 --- a/nsqd/guid.go +++ b/nsqd/guid.go @@ -22,8 +22,8 @@ const ( timestampShift = sequenceBits + workerIDBits sequenceMask = int64(-1) ^ (int64(-1) << sequenceBits) - // Thu Nov 4 01:42:54 UTC 2010 - twepoch = int64(1288834974657) + // ( 2012-10-28 16:23:42 UTC ).UnixNano() >> 20 + twepoch = int64(1288834974288) ) var ErrTimeBackwards = errors.New("time has gone backwards") @@ -39,7 +39,8 @@ type guidFactory struct { } func (f *guidFactory) NewGUID(workerID int64) (guid, error) { - ts := time.Now().UnixNano() / 1e6 + // divide by 1048576, giving pseudo-milliseconds + ts := time.Now().UnixNano() >> 20 if ts < f.lastTimestamp { return 0, ErrTimeBackwards