Если кто-то для контроля работы и отладки скриптов использует ведение лога с временными метками, возможно, эта информация будет полезна.
Чтобы из секунд сделать отформатированный текст (чч:мм:сс), раньше мной использовался такой вариант программы:
- Код: Выделить всё
stime=Call("GetSimulationTime");
h = math.floor(stime/3600);
if h<10 then hour = "0"..string.format("%.0f",h); else hour = string.format("%.0f",h);end
m = math.floor((stime-h*3600)/60);
if m<10 then minute = "0"..string.format("%.0f",m); else minute = string.format("%.0f",m);end
s = math.floor(stime-h*3600-m*60);
if s<10 then sec = "0"..string.format("%.0f",s); else sec = string.format("%.0f",s);end
stime = hour..":"..minute..":"..sec;
Это прямо в исходном виде. Я не знаю, кто автор, так как понятия не имею, откуда вообще ко мне попал скрипт с этим фрагментом. Но спасибо этому человеку, так как этот кусочек, в немного измененном виде, несколько лет работал в моих скриптах.
Все же, мне хотелось как-то сократить и упростить этот кусок. В первую очередь, для ускорения его работы, я переписала его под локальные переменные:
- Код: Выделить всё
local stime=Call ("GetSimulationTime")
local h = math.floor (stime/3600)
if h<10 then hour = "0"..string.format ("%.0f", h) else hour = string.format ("%.0f", h) end
local m = math.floor ((stime-h*3600)/60)
if m<10 then minute = "0"..string.format ("%.0f", m) else minute = string.format ("%.0f", m) end
local s = math.floor (stime-h*3600-m*60)
if s<10 then sec = "0"..string.format ("%.0f", s) else sec = string.format("%.0f", s) end
stime = hour..":"..minute..":"..sec
Потом был ещё один вариант, переход на табличную сборку, для оптимизации расхода памяти:
- Код: Выделить всё
stime, t_time = Call ("GetSimulationTime"), {}
local h = math.floor (stime / 3600)
local m = math.floor ((stime - h * 3600) / 60)
local s = math.floor (stime - h * 3600 - m * 60)
table.insert (t_time, string.format("%02d", h))
table.insert (t_time, string.format("%02d", m))
table.insert (t_time, string.format("%02d", s))
stime = table.concat (t_time, ":")
Потом я открыла для себя ещё один метод:
- Код: Выделить всё
local stime = os.date ("!%X", Call("GetSimulationTime"))
Возникает вопрос - зачем изобретать велосипед, если есть стандартная функция, почему же её не использовать? Но речь не о том. Я больше об оптимизации. Итак, вариант 1 потратил на работу 8.17 условных тиков, вариант 2 - 7.84, вариант 3 - 9.3, вариант 4 - 0.75. Ещё раз: вариант, в котором использована базовая функция конвертирования времени работала в 11(!) раз быстрее, чем та, что гуляет по сети и, наверняка, есть у каждого скриптера.
Как-то так.