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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With