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

4

我正在尝试使用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()返回一个数字,那么这是如何发生的。并且 - 这是否是测量应用程序执行时间的好方法?
3个回答

6

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)

嗯...我仍然认为start_time应该只存储时间快照,因为os.time()返回数字。如果我在解释器中执行t = os.time(); print(t);<some time>;print(t) - 它会返回相同的值。如果我执行t = os.time...那就是另一回事了。感谢您提到os.difftime! - Ola M
它确实存储了一个时间快照,并且它是一个数字。每次运行 start_time = os.time() 时,您都会用新的快照覆盖先前的快照。我之前没有提到这一点,因为这是变量的非常基本的使用,我认为您已经知道了。 - Mud
非常感谢您的耐心回答。我猜我完全错过了我的显示屏会重新绘制这一事实。 - Ola M

5
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和一些其他系统中,这个数字计算自某个给定的起始时间(“纪元”)以来的秒数。在其他系统中,其含义未指定,而time返回的数字只能用作date和difftime的参数。

逐步迭代:

  1. start_time将时间存储为数字。
  2. 您的代码执行需要一些时间。
  3. end_time存储当前时间的数值。它将是大于或等于start_time的数字。
  4. 通过os.difftime()调用计算时间差(语法上有误)。

由于您的系统已经稍微进入了未来的时刻,因此startend的值将在每次迭代中更改。此外,elapsed_time的值报告为1或2秒,这是您的代码执行所需的时间。


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


2
尝试使用love.timer.getTime,它从0.9.0版本开始返回微秒精确的时间。该链接中提供了如何计时的示例。
对于相对时间(通过减法进行比较),这是可以的。如果您想要更多的绝对时间,请尝试类似以下的内容:
do
    local _getTime = love.timer.getTime
    local initialTime = _getTime()

    function appTime()
        return _getTime() - initialTime
    end
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接