Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Determining Millisecond Time Intervals In Cocoa

Tags:

time

cocoa

Just as background, I'm building an application in Cocoa. This application existed originally in C++ in another environment. I'd like to do as much as possible in Objective-C.

My questions are:

1) How do I compute, as an integer, the number of milliseconds between now and the previous time I remembered as now?

2) When used in an objective-C program, including time.h, what are the units of

clock()

Thank you for your help.

like image 773
McPragma Avatar asked Dec 12 '09 14:12

McPragma


2 Answers

You can use CFAbsoluteTimeGetCurrent() but bear in mind the clock can change between two calls and can screw you over. If you want to protect against that you should use CACurrentMediaTime().

The return type of these is CFAbsoluteTime and CFTimeInterval respectively, which are both double by default. So they return the number of seconds with double precision. If you really want an integer you can use mach_absolute_time() found in #include <mach/mach_time.h> which returns a 64 bit integer. This needs a bit of unit conversion, so check out this link for example code. This is what CACurrentMediaTime() uses internally so it's probably best to stick with that.

Computing the difference between two calls is obviously just a subtraction, use a variable to remember the last value.

For the clock function see the documentation here: clock(). Basically you need to divide the return value by CLOCKS_PER_SEC to get the actual time.

like image 187
Mike Weller Avatar answered Oct 22 '22 15:10

Mike Weller


How do I compute, as an integer, the number of milliseconds between now and the previous time I remembered as now?

Is there any reason you need it as an integral number of milliseconds? Asking NSDate for the time interval since another date will give you a floating-point number of seconds. If you really do need milliseconds, you can simply multiply by that by 1000 to get a floating-point number of milliseconds. If you really do need an integer, you can round or truncate the floating-point value.

If you'd like to do it with integers from start to finish, use either UpTime or mach_absolute_time to get the current time in absolute units, then use AbsoluteToNanoseconds to convert that to a real-world unit. Obviously, you'll have to divide that by 1,000,000 to get milliseconds.

QA1398 suggests mach_absolute_time, but UpTime is easier, since it returns the same type AbsoluteToNanoseconds uses (no “pointer fun” as shown in the technote).

AbsoluteToNanoseconds returns an UnsignedWide, which is a structure. (This stuff dates back to before Mac machines could handle scalar 64-bit values.) Use the UnsignedWideToUInt64 function to convert it to a scalar. That just leaves the subtraction, which you'll do the normal way.

like image 31
Peter Hosey Avatar answered Oct 22 '22 14:10

Peter Hosey