Time 在Scheme中测量运行时间的最佳方法

Time 在Scheme中测量运行时间的最佳方法,time,scheme,chicken-scheme,Time,Scheme,Chicken Scheme,我有一些使用glut的“主循环”。我希望能够测量渲染帧所需的时间。渲染帧所用的时间可能用于其他计算。功能time的使用不充分 (time (procedure)) 我发现有一个函数叫做current time。我必须进口一些包裹才能得到它 (define ct (current-time)) 将ct定义为时间对象。不幸的是,我在scheme中找不到任何日期的算术包。我看到在Racket中有一个叫做当前不精确毫秒的东西,这正是我想要的,因为它有纳秒 使用时间对象,有一种方法可以使用 (time

我有一些使用glut的“主循环”。我希望能够测量渲染帧所需的时间。渲染帧所用的时间可能用于其他计算。功能
time
的使用不充分

(time (procedure))
我发现有一个函数叫做
current time
。我必须进口一些包裹才能得到它

(define ct (current-time))
将ct定义为时间对象。不幸的是,我在scheme中找不到任何日期的算术包。我看到在Racket中有一个叫做
当前不精确毫秒的东西,这正是我想要的,因为它有纳秒

使用时间对象,有一种方法可以使用

(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
对我来说似乎已经足够好了,只是出于某些原因,它在打印这样的东西

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

我正在使用opengl渲染东西,我发现很难相信某些渲染循环需要0纳秒。每一个循环都是非常强的>稳定的< /强>足够的,总是占用相同数量的纳秒。

< P>毕竟,你的结果并不令人惊讶,因为我们必须考虑每个系统的有限的定时器分辨率。事实上,处理器和操作系统进程通常都有一些限制。尽管石英振荡器可以达到并超过一纳秒的周期,但它们无法以比我们预期的更精确的方式计数。您还受到所用函数的精度和分辨率的限制。我看了一下Chicken scheme的文档,但没有类似的内容(当前的不精确毫秒)→ 真实的关于Racket。

在深入研究之后,我提出了一个解决方案,我应该用C编写它,并使用绑定将它绑定到scheme

(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
)
(需要扩展绑定)
(绑定重命名“getTime”“当前微秒”)

(bind*#CHICKEN有当前毫秒:

听起来你的
当前时间的粒度是10微秒。你可能想测量更大的一批工作,例如1000次迭代,然后将结果时间除以1000。问题是我的方案中没有
当前的不精确毫秒。(鸡肉计划)不清楚在哪里可以买到。