Използвам TickCount()
, за да определя разликата във времето между събитията или времето, необходимо за изпълнение на определена част от кода. Но той е отхвърлен в OS X 10.8. Следователно имах нужда от алтернатива за същото.
TickCount() е остарял в Mac OS X 10.8
Отговори (2)
Ако искате да измерите абсолютно време, използвайте
gettimeofday()
. Това ви дава датата, например „Чет, 22 ноември 07:48:52 UTC 2012 г.“. Това не винаги е подходящо за измерване на разликите между събитията, тъй като времето, отчетено отgettimeofday()
, може да скочи напред или назад, ако потребителят промени часовника.Ако искате да измерите относителното време,
mach_absolute_time()
. Това ви позволява да измервате разликата между две събития, например „15,410 s“. Това не дава абсолютни времена, но винаги е монотонно.Ако искате да измерите процесорното време, използвайте
clock()
. Това е често, но не винаги начинът, по който измервате ефективността на част от кода. Не отчита времето, прекарано на IO, или въздействието върху скоростта на системата, така че трябва да се използва само когато знаете, че измервате нещо, свързано с процесора.
Изненадан съм, че TickCount()
не беше отхвърлен по-рано. Това наистина е OS 9 и по-ранна версия.
mach_absolute_time()
ще изпълни целта ми. Благодаря много.
- person dDarkLORD; 22.11.2012
gettimeofday()
обаче е по-преносим.
- person trojanfoe; 22.11.2012
clock_gettime()
, в OS X бихте използвали mach_absolute_time()
, нито едно от които не е налично в другата операционна система.
- person Dietrich Epp; 22.11.2012
Въпреки че този API може да не е подходящ за нова разработка, ако откриете, че се нуждаете от идентичен API, той може да бъде внедрен отново, както следва:
uint32_t TickCount() {
uint64_t mat = mach_absolute_time();
uint32_t mul = 0x80d9594e;
return ((((0xffffffff & mat) * mul) >> 32) + (mat >> 32) * mul) >> 23;
}
Горната реализация е създадена чрез анализ на /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/CarbonCore
и е тествана за кратко спрямо отхвърления TickCount
с LLDB чрез промяна на регистрите, върнати от mach_absolute_time
.