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

时间:2013-03-27 16:57:04

标签: 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()返回一个数字,会发生什么。而且 - 这是衡量我的申请执行时间的好方法吗?

3 个答案:

答案 0 :(得分:6)

startend应该一直在增长,除非时间停止,在这种情况下,我们都遇到了麻烦。

它们之间的差异将随<some code>执行的时间而变化。

os.time通常会返回过去某个任意点(通常是1/1/1970 00:00:00)的秒数。这不保证(它是用C的time函数which makes no such guarantees实现的)。但它肯定应该一直在推进,或者它并没有真正给你时间,对吗?


是的,你使用difftime错了。你应该传递两个值,它会给你它们之间的差异。你传递了一个值。它应该 barf,但它似乎返回了第一个值,在你的情况下意外工作,因为你碰巧在difftime实际上是t2-t1的机器上。在其他系统上,这可能会破裂。您应该将呼叫更改为:

elapsed_time = os.difftime(end_time,start_time)

答案 1 :(得分:2)

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和其他一些系统中,这个数字计算在内   一些给定的开始时间(“epoch”)以来的秒数。其他   系统,未指定含义,以及按时间返回的数字   只能用作date和difftime的参数。

逐步迭代:

  1. start_time将时间存储为数字。
  2. 您的代码需要一段时间才能执行。
  3. end_time现在存储时间的数值。它将是一个大于或等于start_time的数字。
  4. 时差由os.difftime()电话(which is syntactically wrong)计算。

  5. 每次迭代都会更改startend的值,因为您的系统自epoch以来已经向前推进了一点点。此外,elapsed_time的值报告为1或2秒,这是您的代码自行执行所需的时间。


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

答案 2 :(得分:2)

尝试love.timer.getTime,从0.9.0开始,返回微秒级的准确时间。该链接有一个如何计时的例子。

对于相对时间(减去比较)是可以的。如果您想要更多的绝对时间,请尝试以下方法:

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

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