Luaj os.time() возвращает миллисекунды

os.time() в Luaj возвращает время в миллисекундах, но, согласно документации lua, он должен возвращать время в секундах.

  1. Это ошибка в Luaj?
  2. И можете ли вы предложить обходной путь, который будет работать с Luaj (для java) и настоящим Lua (c/c++)? потому что я должен использовать один и тот же источник lua ​​для обоих приложений (не могу просто разделить его на 1000, так как они оба возвращают разную временную шкалу)

пример в моем файле lua:

local start = os.time()
while(true) do
    print(os.time() - start)
end

в С++ я получил вывод:

1
1
1
...(1 seconds passed)
2
2
2

в java (с использованием Luaj) я получил:

1
...(terminate in eclipse as fast as my finger can)
659
659
659
659

к вашему сведению, я пробую это на окнах


person bysreg    schedule 24.04.2013    source источник
comment
os.time() возвращает время в секундах. Вероятно, вы путаете единицы с точностью. 12.423 — это время в секундах с точностью до миллисекунды.   -  person David Schwartz    schedule 24.04.2013
comment
os.time() должен возвращать время в секундах. но в Luaj вместо этого он возвращается в миллисекундах (я думаю, по крайней мере, когда я изменяю его на 1000, это похоже на секунду)   -  person bysreg    schedule 24.04.2013
comment
Можете ли вы привести пример? Я думаю, что он возвращает время в секундах, но с точностью до миллисекунды, и вы видите точность и путаете ее с единицами измерения.   -  person David Schwartz    schedule 24.04.2013
comment
@DavidSchwartz я добавил пример кода в свой вопрос выше   -  person bysreg    schedule 24.04.2013


Ответы (4)


Руководство Lua по os.time():

Возвращаемое значение представляет собой число, значение которого зависит от вашей системы. В POSIX, Windows и некоторых других системах это число подсчитывает количество секунд, прошедших с некоторого заданного времени запуска («эпоха»). В других системах значение не указывается, и число, возвращаемое временем, может использоваться только в качестве аргумента для os.date и os.difftime.

Таким образом, любая реализация Lua может свободно изменять значение значения os.time().

person Egor Skriptunoff    schedule 24.04.2013
comment
... В POSIX, Windows и некоторых других системах ... подсчитывает количество секунд, извините, я должен был упомянуть, какая у меня система. Я использую окна. поэтому он должен возвращать количество секунд, верно? - person bysreg; 24.04.2013
comment
@bysreg - Слова о POSIX, Windows относятся только к ванильному Lua. Luaj не работает на Windows, он работает на Java. ;-) - person Egor Skriptunoff; 24.04.2013
comment
кажется, нет лучшего способа, чем использовать os.clock(), поэтому я выбираю это как ответ - person bysreg; 24.04.2013

Да, есть ошибка в luaj.

Реализация просто возвращает System.currentTimeMillis() при вызове os.time(). Он действительно должен возвращать что-то вроде (long)(System.currentTimeMillis()/1000.)

Также стоит отметить, что обработка os.date и os.time в luaj почти полностью отсутствует. Я бы порекомендовал вам предположить, что они еще не реализованы.

person Alex    schedule 24.04.2013
comment
после поиска в коде для проверки вашего заявления я подтвердил, что реализация luaj использует System.currentTimeMillis() для реализации os.time() (вы можете увидеть это в строке 308 OsLib.java) - person bysreg; 24.04.2013

Похоже, вы уже подтвердили, что это ошибка в LuaJ; что касается обходного пути, вы можете заменить os.time() своей версией:

if (runningunderluaj) then
  local ostime = os.time
  os.time = function(...) return ostime(...)/1000 end
end

где runningunderluaj может проверять некоторую глобальную переменную, которая установлена ​​только в luaj. Если это недоступно, вы, вероятно, можете придумать свою собственную проверку, сравнив результаты вызовов os.clock и os.time, которые измеряют разницу во времени:

local s = os.clock()
local t = os.time()
while true do
  if os.clock()-s > 0.1 then break end
end
-- (at least) 100ms has passed
local runningunderluaj = os.time() - t > 1

Примечание. Возможно, что os.clock() тоже "сломан". У меня нет доступа к luaj, чтобы проверить это...

person Paul Kulchenko    schedule 24.04.2013
comment
os.clock() возвращает приблизительное количество в секундах процессорного времени, используемого программой. - person hjpotter92; 24.04.2013
comment
@ hjpotter92, правильно, но у него точность мс, поэтому расчет дельты должен быть в порядке. - person Paul Kulchenko; 25.04.2013

В luaj-3.0-beta2 это было исправлено, чтобы возвращать время в секундах.

Это была ошибка во всех версиях luaj до luaj-3.0-beta1 включительно.

person Jim Roseborough    schedule 07.01.2014