99 бутылок пива
(defn bottles [n & [capitalize]]
(str (if (> n 0) n (if capitalize "No more" "no more"))
" bottle" (if (= 1 n) "" "s") " of beer" ))
(defn bot-wall [n & cap] (str (bottles n cap) " on the wall"))
(defn sing
; Default is 99 times.
([] (sing 99))
([stock]
(doseq [i (range stock -1 -1)]
(printf "%s, %s.\n%s.\n\n"
(bot-wall i true) (bottles i)
(apply str
(if (> i 0)
["Take one down and pass it around, " (bot-wall (dec i))]
["Go to the store and buy some more, " (bot-wall stock)]
))))))
(sing)
Фактически, + [NSDate timeIntervalSinceReferenceDate]
возвращает NSTimeInterval
, который является typedef для двойного. В документации говорится, что
NSTimeInterval всегда указывается в секундах; он обеспечивает точность до субмиллисекунд в диапазоне 10 000 лет.
Таким образом, его безопасно использовать для измерения времени с точностью до миллисекунды. Я так делаю все время.
Для очень точной синхронизации в OS X я использую mach_absolute_time ()
, который определен в
. Вы можете использовать его следующим образом:
#include <mach/mach_time.h>
#include <stdint.h>
static double ticksToNanoseconds = 0.0;
uint64_t startTime = mach_absolute_time( );
// Do some stuff you want to time here
uint64_t endTime = mach_absolute_time( );
// Elapsed time in mach time units
uint64_t elapsedTime = endTime - startTime;
// The first time we get here, ask the system
// how to convert mach time units to nanoseconds
if (0.0 == ticksToNanoseconds) {
mach_timebase_info_data_t timebase;
// to be completely pedantic, check the return code of this next call.
mach_timebase_info(&timebase);
ticksToNanoseconds = (double)timebase.numer / timebase.denom;
}
double elapsedTimeInNanoseconds = elapsedTime * ticksToNanoseconds;
Если вы пытаетесь настроить производительность своего кода, лучше использовать инструменты или Shark, чтобы получить общую картину того, на что ваше приложение тратит свое время.
Не используйте для этого NSDate
. Вы теряете большую точность для вызова методов и создания экземпляров объектов, возможно, даже освобождаете что-то внутреннее. У вас просто недостаточно контроля.
Используйте либо time.h
, либо Стивен Кэнон предложил mach / mach_time.h
. Они оба намного более точны.
Лучший способ сделать это - запустить Instruments или Shark, прикрепить их к вашему процессу (работает, даже если он уже запущен) и позволить им измерить время, необходимое для метода.
После того, как вы ознакомитесь с ним, это займет даже меньше времени, чем любое решение, включающее в себя функции «вставьте-время-время-и-перекомпилируйте-все-приложение». Вы даже получите много дополнительной информации. На меньшее я бы не согласился.
timeIntervalSinceReferenceDate
прекрасно.
Однако, если это не длительный метод, это не принесет больших плодов. Время выполнения может сильно различаться, если вы говорите о нескольких миллисекундах. Если ваш поток / процесс прерывается на полпути, у вас будут недетерминированные всплески. По сути, размер вашей выборки слишком мал. Либо используйте профилировщик, либо запустите 100 000 итераций, чтобы получить общее время, и разделите на 100 000, чтобы получить среднее время выполнения.