TickCount() е остарял в Mac OS X 10.8

Използвам TickCount(), за да определя разликата във времето между събитията или времето, необходимо за изпълнение на определена част от кода. Но той е отхвърлен в OS X 10.8. Следователно имах нужда от алтернатива за същото.


person dDarkLORD    schedule 22.11.2012    source източник
comment
Моля, щракнете върху отхвърлената връзка в оригиналната публикация и потърсете TickCount за документация.   -  person dDarkLORD    schedule 22.11.2012
comment
Добре, разбрах. Дори не бях чувал за това.   -  person trojanfoe    schedule 22.11.2012


Отговори (2)


  1. Ако искате да измерите абсолютно време, използвайте gettimeofday(). Това ви дава датата, например „Чет, 22 ноември 07:48:52 UTC 2012 г.“. Това не винаги е подходящо за измерване на разликите между събитията, тъй като времето, отчетено от gettimeofday(), може да скочи напред или назад, ако потребителят промени часовника.

  2. Ако искате да измерите относителното време, mach_absolute_time(). Това ви позволява да измервате разликата между две събития, например „15,410 s“. Това не дава абсолютни времена, но винаги е монотонно.

  3. Ако искате да измерите процесорното време, използвайте clock(). Това е често, но не винаги начинът, по който измервате ефективността на част от кода. Не отчита времето, прекарано на IO, или въздействието върху скоростта на системата, така че трябва да се използва само когато знаете, че измервате нещо, свързано с процесора.

Изненадан съм, че TickCount() не беше отхвърлен по-рано. Това наистина е OS 9 и по-ранна версия.

person Dietrich Epp    schedule 22.11.2012
comment
Вярвам, че mach_absolute_time() ще изпълни целта ми. Благодаря много. - person dDarkLORD; 22.11.2012
comment
@dDarkLORD gettimeofday() обаче е по-преносим. - person trojanfoe; 22.11.2012
comment
@trojanfoe: Няма смисъл да използвате преносимата функция, ако тя не прави това, което искате. В Linux бихте използвали 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.

person Alexander O'Mara    schedule 12.03.2016