В чем разница между использованием R microbenchmark и system.time?

Я хотел бы понять разницу между микротестом R и system.time()? Как они внутренне измеряют время выполнения функции?


person Satish Verma    schedule 18.02.2015    source источник
comment
?microbenchmark дает довольно подробные сведения о том, как он измеряет время выполнения. Что конкретно вы хотите узнать?   -  person josliber♦    schedule 18.02.2015
comment
Это может быть интересно из блога Рэдфорда Нила: Неточные результаты. из микробенчмарка   -  person thelatemail    schedule 18.02.2015
comment
microbenchmark основан на повторяющихся итерациях. system.time - это время для одного запуска.   -  person IRTFM    schedule 18.02.2015
comment
@thelatemail В сообщении в блоге, на которое вы ссылались, упоминалось об отсутствии среднего значения в результатах микробенчмарка (если в общих чертах перефразировать: если вас не волнует сборка мусора или другие случайные накладные расходы, тогда медиана лучше; если вас это волнует тогда среднее лучше). С тех пор функция была обновлена, и теперь она возвращает обе меры, так что проблемы больше нет.   -  person Richie Cotton    schedule 18.02.2015


Ответы (1)


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

Как описано в разделе «Подробности» документа ?system.time:

system.time вызывает функцию proc.time, вычисляет expr, а затем снова вызывает proc.time, возвращая разницу между двумя вызовами proc.time.

proc.time является примитивным, а код C находится в src/main/times.c. Комментарии в этом файле:

proc.time() использует currentTime() для прошедшего времени и getrusage, затем times для процессорного времени в Unix-подобном, GetProcessTimes в Windows.


Из раздела «Примечания» на странице ?microbenchmark:

В зависимости от базовой операционной системы для синхронизации используются разные методы. В Windows интерфейс QueryPerformanceCounter используется для измерения прошедшего времени. В Linux используется API clock_gettime, а в Solaris — функция gethrtime. Наконец, в MacOS X используется недокументированная функция mach_absolute_time, чтобы избежать зависимости от CoreServices Framework.

Я не могу найти репозиторий микробенчмарков, поэтому вам придется загрузить исходный код, чтобы увидеть точные детали, но время определяется do_microtiming в src/nanotimer.c, который вызывает зависящую от ОС версию get_nanotime в src/nanotimer_nanotimer_gettime.h/src/nanotimer_nanotimer_macosx.h/src/nanotimer_nanotimer_rtposix.h. /src/nanotimer_nanotimer_windows.h.

person Richie Cotton    schedule 18.02.2015