Определение миллисекундных временных интервалов в Cocoa

В качестве фона я создаю приложение в Cocoa. Это приложение изначально существовало на C++ в другой среде. Я хотел бы сделать как можно больше в Objective-C.

Мои вопросы:

1) Как мне вычислить, как целое число, количество миллисекунд между настоящим моментом и предыдущим моментом, когда я помнил, что сейчас?

2) При использовании в программе Objective-C, включая time.h, каковы единицы

Часы()

Спасибо за помощь.


person McPragma    schedule 12.12.2009    source источник


Ответы (2)


Вы можете использовать CFAbsoluteTimeGetCurrent(), но имейте в виду, что часы могут измениться между двумя звонками и могут вас подвести. Если вы хотите защититься от этого, вы должны использовать CACurrentMediaTime().

Тип возвращаемого значения для них — CFAbsoluteTime и CFTimeInterval соответственно, оба значения по умолчанию — double. Таким образом, они возвращают количество секунд с точностью double. Если вам действительно нужно целое число, вы можете использовать mach_absolute_time(), найденное в #include <mach/mach_time.h>, которое возвращает 64-битное целое число. Это требует небольшого преобразования единиц измерения, поэтому перейдите по этой ссылке. например код. Это то, что CACurrentMediaTime() использует внутри, так что, вероятно, лучше придерживаться этого.

Вычисление разницы между двумя вызовами, очевидно, является просто вычитанием, используйте переменную, чтобы запомнить последнее значение.

Для функции clock см. документацию здесь: clock(). В основном вам нужно разделить возвращаемое значение на CLOCKS_PER_SEC, чтобы получить фактическое время.

person Mike Weller    schedule 12.12.2009
comment
Ссылка на документ, не относящийся к C++, для clock: developer.apple.com/mac/library/documentation/Darwin/Reference/ - person Peter Hosey; 12.12.2009

Как мне вычислить, как целое число, количество миллисекунд между настоящим моментом и предыдущим моментом, когда я помнил, что сейчас?

Есть ли причина, по которой вам это нужно как целое число миллисекунд? Запрашивая у NSDate интервал времени с другой даты, вы получите число секунд с плавающей запятой. Если вам действительно нужны миллисекунды, вы можете просто умножить их на 1000, чтобы получить число миллисекунд с плавающей запятой. Если вам действительно нужно целое число, вы можете округлить или усечь значение с плавающей запятой.

Если вы хотите сделать это с целыми числами от начала до конца, используйте либо UpTime, либо mach_absolute_time, чтобы получить текущее время в абсолютных единицах, а затем используйте AbsoluteToNanoseconds, чтобы преобразовать его в реальные единицы. Очевидно, вам придется разделить это на 1 000 000, чтобы получить миллисекунды.

QA1398 предлагает mach_absolute_time, но UpTime проще, поскольку возвращает тот же тип, который использует AbsoluteToNanoseconds (никаких «удовольствий с указателем», как показано в технической заметке).

AbsoluteToNanoseconds возвращает UnsignedWide, который является структурой. (Этот материал восходит к тому времени, когда машины Mac не могли обрабатывать скалярные 64-битные значения.) Используйте функцию UnsignedWideToUInt64, чтобы преобразовать его в скаляр. Остается только вычитание, которое вы сделаете обычным способом.

person Peter Hosey    schedule 12.12.2009