测量Scheme中已用时间的最佳方法

时间:2013-09-16 21:18:34

标签: time scheme chicken-scheme

我有一些使用过剩的“主循环”。我希望能够测量渲染帧所需的时间。用于渲染帧的时间可用于其他计算。使用函数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纳秒。并且每个循环都非常稳定足以始终采用相同的纳秒数。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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
)

不幸的是,这种解决方案不是最好的,因为它只是鸡计划。它可以实现为一个库,但是只包含一个在任何其他方案中不存在的函数的库没有意义。

因为纳秒实际上并没有多大意义,所以我得到了微秒。

在这里观察技巧,定义要包含在上面的函数,并防止include被bind解析。当文件将在Gcc中加载时,它将使用include和函数定义构建。

答案 2 :(得分:0)