Лучший способ измерить прошедшее время в схеме

У меня есть какой-то «основной цикл», использующий перенасыщение. Я хотел бы иметь возможность измерить, сколько времени требуется для рендеринга кадра. Время, используемое для рендеринга кадра, может быть использовано для других вычислений. Использование функции time неадекватно.

(time (procedure))

Я узнал, что есть функция под названием current-time. Мне пришлось импортировать какой-то пакет, чтобы получить его.

(define ct (current-time))

Которые определяют ct как объект time. К сожалению, я не смог найти в схеме арифметических пакетов для дат. Я видел, что в Racket есть что-то под названием current-inexact-milliseconds, и это именно то, что я ищу, потому что у него есть наносекунды.

Используя объект времени, есть способ преобразовать его в наносекунды, используя

(time->nanoseconds ct)

Это позволяет мне сделать что-то вроде этого

(let ((newTime (current-time)))
   (block)
   (print (- (time->nanoseconds newTime) (time->nanoseconds oldTime)))
   (set! oldTime newTime))

Мне кажется достаточно хорошим, за исключением того, что по некоторым причинам он печатал такие вещи

0
10000
0
0
10000
0
10000

Я делаю рендеринг с помощью opengl, и мне трудно поверить, что какой-то цикл рендеринга занимает 0 наносекунд. И что каждый цикл достаточно стабильен, чтобы всегда занимать одно и то же количество наносекунд.


person Loïc Faure-Lacroix    schedule 16.09.2013    source источник
comment
Похоже, ваш current-time имеет гранулярность 10 микросекунд. Возможно, вы захотите измерить больший объем работы, например, 1000 итераций, а затем разделить полученное время на 1000.   -  person Chris Jester-Young    schedule 17.09.2013


Ответы (3)


В конце концов, ваши результаты не так уж удивительны, потому что мы должны учитывать ограниченное разрешение таймера для каждой системы. На самом деле есть некоторые ограничения, которые зависят в основном от процессора и от процессов ОС. Они не могут считать точно, как мы ожидаем, несмотря на то, что кварцевый генератор может достигать и превышать период наносекунды. Вы также ограничены точностью и разрешением функций, которые вы использовали. Я просмотрел документацию схемы Chicken, но нет ничего похожего на (current-inexact-milliseconds) → real? ракетки.

person Modestino    schedule 17.09.2013
comment
проблема в том, что у меня нет current-inextact-milliseconds в моей схеме. (Куриная схема) Непонятно где взять. - person Loïc Faure-Lacroix; 17.09.2013

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

(require-extension bind)

(bind-rename "getTime" "current-microseconds")

(bind* #<<EOF
uint64_t getTime();

#ifndef CHICKEN
#include <sys/time.h>
uint64_t getTime() {
    struct timeval tim;
    gettimeofday(&tim, NULL);
    return 1000000 * tim.tv_sec + tim.tv_usec;
}
#endif

EOF
)

К сожалению, это решение не самое лучшее, потому что это будет только куриная схема. Это может быть реализовано как библиотека, но библиотека для обертывания только одной функции, которая не существует ни в одной другой схеме, не имеет смысла.

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

Смотрите трюк здесь, определите функцию для переноса выше и предотвратите анализ включения с помощью bind. Когда файл будет загружен в Gcc, он будет собран с включением и определением функции.

person Loïc Faure-Lacroix    schedule 21.09.2013

КУРИЦА имеет текущие миллисекунды: http://api.call-cc.org/doc/library/current-milliseconds

person sjamaan    schedule 03.12.2014