strange performance differences of 1.2.2 vs 1.2.5
    Sean Chittenden 
    sean at chittenden.org
       
    Mon Jun  2 04:34:36 UTC 2008
    
    
  
>> That's a good guess (Brian? You know about that?:) ... but a bit  
>> doubtful.
>
> When I submitted the first patch using clock_gettime() there was a  
> push back for this, so I moved back to gettimeofday(). I don't  
> remember the argument now, but gettimeofday() is at least better  
> then time() (which was what was there first).
>
> One point, the time value is not being properly stored anyway.  
> Technically it requires a lock around it (volatile is not enough to  
> guarantee synchronous update).
>
> I would argue along with Sean that clock_gettime() would be better,  
> but I can not remember any longer what the objections were.
When in doubt, benchmark (and I'm glad I did).  I wasn't present/ 
involved with the discussion, but I'd guess it had something to do  
with POSIX being lax in its definition of clockid_t, the meaning of  
its values and various clockid_t values not being defined universally.
I wrote a small micro-benchmark utility to see what's the fastest time  
syscall.  I cribbed phk@'s recommendation for CLOCK_MONOTONIC/ 
MONOTONIC_FAST in a post which I blindly repeated earlier in this  
thread... and that information happened to be either old or  
incorrect.  time(3) is just as expensive as gettimeofday(2) (which  
surprised the hell out of me - why it's not implemented in terms of  
CLOCK_SECOND, I'm not sure).  clock_gettime(CLOCK_REALTIME_FAST) is  
the fastest time syscall for non-monotomic time retrieval.
http://sean.chittenden.org/pubfiles/freebsd/bench_time.c
% ./bench_time 9079882 | sort -rnk1
Timing micro-benchmark.  9079882 syscall iterations.
Avg. us/call    Elapsed     Name
9.322484    84.647053       gettimeofday(2)
8.955324    81.313291       time(3)
8.648315    78.525684       clock_gettime(2/CLOCK_REALTIME)
8.598495    78.073325       clock_gettime(2/CLOCK_MONOTONIC)
0.674194    6.121600        clock_gettime(2/CLOCK_PROF)
0.648083    5.884515        clock_gettime(2/CLOCK_VIRTUAL)
0.330556    3.001412        clock_gettime(2/CLOCK_REALTIME_FAST)
0.306514    2.783111        clock_gettime(2/CLOCK_SECOND)
0.262788    2.386085        clock_gettime(2/CLOCK_MONOTONIC_FAST)
Last value from gettimeofday(2): 1212380080.620649
Last value from time(3): 1212380161
Last value from clock_gettime(2/CLOCK_VIRTUAL): 2.296430000
Last value from clock_gettime(2/CLOCK_SECOND): 1212380338.000000000
Last value from clock_gettime(2/CLOCK_REALTIME_FAST):  
1212380243.461081040
Last value from clock_gettime(2/CLOCK_REALTIME): 1212380240.459788612
Last value from clock_gettime(2/CLOCK_PROF): 185.560343000
Last value from clock_gettime(2/CLOCK_MONOTONIC_FAST): 5747219.271879584
Last value from clock_gettime(2/CLOCK_MONOTONIC): 5747216.886509281
For the kernel curious:
http://fxr.watson.org/fxr/source/kern/kern_time.c#L200
-sc
--
Sean Chittenden
sean at chittenden.org
http://sean.chittenden.org/
    
    
More information about the memcached
mailing list