0

我有某种使用过剩的“主循环”。我希望能够测量渲染一帧需要多少时间。用于渲染帧的时间可能用于其他计算。该功能的使用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 纳秒。并且每个循环都非常稳定,可以始终花费相同的纳秒时间。

4

3 回答 3

0

毕竟,您的结果并不令人惊讶,因为我们必须考虑每个系统的有限计时器分辨率。事实上,有一些限制通常取决于处理器和操作系统进程。尽管石英振荡器可以达到并超过一纳秒的周期,但它们无法以比我们预期的准确方式计数。您还受到所使用功能的准确性和分辨率的限制。我查看了 Chicken scheme 的文档,但没有类似于 (current-inexact-milliseconds) → real?球拍。

于 2013-09-17T12:26:07.080 回答
0

鸡有当前毫秒:http ://api.call-cc.org/doc/library/current-milliseconds

于 2014-12-03T15:49:22.543 回答
0

在四处挖掘之后,我提出了应该用 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 中加载时,它将使用包含和函数定义进行构建。

于 2013-09-21T21:35:45.700 回答