Элементарные способы измерить время выполнения метода

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)

http://99-bottles-of-beer.net/language-clojure-1996.html

5
задан Alexi Groove 23 October 2009 в 21:29
поделиться

5 ответов

Фактически, + [NSDate timeIntervalSinceReferenceDate] возвращает NSTimeInterval , который является typedef для двойного. В документации говорится, что

NSTimeInterval всегда указывается в секундах; он обеспечивает точность до субмиллисекунд в диапазоне 10 000 лет.

Таким образом, его безопасно использовать для измерения времени с точностью до миллисекунды. Я так делаю все время.

9
ответ дан 18 December 2019 в 05:18
поделиться

Для очень точной синхронизации в 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;
25
ответ дан 18 December 2019 в 05:18
поделиться

Если вы пытаетесь настроить производительность своего кода, лучше использовать инструменты или Shark, чтобы получить общую картину того, на что ваше приложение тратит свое время.

1
ответ дан 18 December 2019 в 05:18
поделиться

Не используйте для этого NSDate . Вы теряете большую точность для вызова методов и создания экземпляров объектов, возможно, даже освобождаете что-то внутреннее. У вас просто недостаточно контроля.

Используйте либо time.h , либо Стивен Кэнон предложил mach / mach_time.h . Они оба намного более точны.

Лучший способ сделать это - запустить Instruments или Shark, прикрепить их к вашему процессу (работает, даже если он уже запущен) и позволить им измерить время, необходимое для метода.

После того, как вы ознакомитесь с ним, это займет даже меньше времени, чем любое решение, включающее в себя функции «вставьте-время-время-и-перекомпилируйте-все-приложение». Вы даже получите много дополнительной информации. На меньшее я бы не согласился.

4
ответ дан 18 December 2019 в 05:18
поделиться

timeIntervalSinceReferenceDate прекрасно.

Однако, если это не длительный метод, это не принесет больших плодов. Время выполнения может сильно различаться, если вы говорите о нескольких миллисекундах. Если ваш поток / процесс прерывается на полпути, у вас будут недетерминированные всплески. По сути, размер вашей выборки слишком мал. Либо используйте профилировщик, либо запустите 100 000 итераций, чтобы получить общее время, и разделите на 100 000, чтобы получить среднее время выполнения.

2
ответ дан 18 December 2019 в 05:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: