在lua(+love2D)中测量经过的时间

我正在尝试使用os.time()函数在LOVE框架中测量我的代码执行时间并显示它。但是,令我惊讶的是,显示的时间在变化......我的代码是:

function foo()
    start_time = os.time()
        <some code>
    end_time = os.time()
    elapsed_time = os.difftime(end_time-start_time)
    love.graphics.print('start time: '   .. start_time .. 's', 12, 12)
    love.graphics.print('end time: '     .. end_time .. 's', 12, 22)
    love.graphics.print('time elapsed: ' .. elapsed_time .. 's', 12, 32)
end

当我离开显示我的图形的窗口时,时间会变化(开始和结束越来越长,并且差异在1和2之间变化)-所以第一个问题是,如果os.time()返回一个数字,那么这是如何发生的。而且-这是衡量应用程序执行时间的好方法吗?

点赞
用户501459
用户501459

startend 应该始终增加,除非时间停止,否则我们都有麻烦了。

它们之间的差值将根据执行某些代码的时间 <some code> 的长短而改变。

os.time 通常返回自过去某一点(通常是 1970 年 1 月 1 日 00:00:00)以来的秒数。虽然不能保证这一点(它是基于 C 的 time 函数实现的,该函数没有这样的保证),但它应该始终在增加,否则它实际上没有给你时间,对吧?


顺便说一句,你使用 difftime 的方法不对。你应该传递两个值,它会给出它们之间的差值,而你只传递了一个值。它本应该崩溃的,但在你的情况下它似乎返回了第一个值,这是因为你碰巧在一台 difftime 实际上是 t2-t1 的机器上,而在其他系统上,这可能会出问题。你应该更改调用为:

elapsed_time = os.difftime(end_time,start_time)
2013-03-27 17:23:05
用户1190388
用户1190388

function foo() start_time = os.time() -- 记录开始时间 <some code> -- 执行你的代码 end_time = os.time() -- 记录结束时间 elapsed_time = os.difftime(end_time, start_time) -- 计算经过的时间 love.graphics.print('start time: ' .. start_time .. 's', 12, 12) -- 打印开始时间 love.graphics.print('end time: ' .. end_time .. 's', 12, 22) -- 打印结束时间 love.graphics.print('time elapsed: ' .. elapsed_time .. 's', 12, 32) -- 打印经过时间 end

首先,关于 os.time() 的信息:

返回的值是一个数字,它的含义取决于你的系统。 在 POSIX、Windows 和一些其他系统中,这个数字表示自某个指定起始时间("纪元")以来经过的秒数。在其他系统中,其含义未被指定,而时间返回值只能用作参数向 date 和 difftime。

逐步迭代:

  1. start_time 存储时间作为数字。
  2. 你的代码需要一些时间来执行。
  3. end_time 存储目前的时间数值。它将会是大于等于 start_time 的数值。
  4. 使用 os.difftime()其语法错误)来计算时间差异。

startend 的值将随着每次迭代而改变,因为你的系统已经在时间轴上向前移动了一点点。此外,elapsed_time 的值被报告为 1 或 2 秒,这是你的代码执行所需要的时间。


你还可以使用 Lua 的 os.clock() 来返回执行你的代码所需的时间(以秒为单位)。

2013-03-27 18:39:43
用户798374
用户798374

尝试使用[love.timer.getTime](https://love2d.org/wiki/love.timer.getTime),自0.9.0起返回微秒精度的时间。该链接中提供了如何计时的示例。

对于相对时间(通过减法比较),这是可以的。如果您想要更准确的绝对时间,请尝试以下方式:

do
    local _getTime = love.timer.getTime
    local initialTime = _getTime()

    function appTime()
        return _getTime() - initialTime
    end
end
2014-03-16 22:10:00