Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Вопрос по таймеру
sutra
сообщение 30.7.2021, 12:29
Сообщение #1


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



У меня остался открытым только один вопрос. А есть возможность через ffi получить системное время с точностью до 1-ой миллисекунды. К сожалению, используя os.clock() , я имею максимум точности 1 сотую секунды, а минимум вообще 16 сотых (почему иногда 15-16 сотых получается не знаю, самому интересно).
В 99% случаев конечно всё устраивает, но хотелось бы иметь все 100%.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 30.7.2021, 13:04
Сообщение #2


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26708
Пользователь №: 16.971
Возраст: 29



Код
--lua
log 'clear' log 'mode compact'
while true do
    log (os.clock ())
end

Цитата
а минимум вообще 16 сотых

Так работает функция Sleep в винде.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 30.7.2021, 13:52
Сообщение #3


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Так и получается точность 16 сотых. По 6 раз одно и то же время выводит. Потом сразу + 16 сотых. Что-то я сомневаюсь что так Винда работает. Во всяком случае когда запускал бенчмарк от Cockney, там всё довольно точно, я такой градации не видел.

Хотя конечно могу и ошибаться, сам в Дельфине не проверял. Ну за спрос денег не берут.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 30.7.2021, 14:26
Сообщение #4


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Проверил функцию Time в Делфи. Всё как надо. Сделал небольшую задержку - получил + 1 тысячную секунды.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 30.7.2021, 14:37
Сообщение #5


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21062
Пользователь №: 16.156



Можно через ядро

https://gist.github.com/HoShiMin/b448203590d55518123f

Или дергать эту функцию https://docs.microsoft.com/en-us/windows/wi...formancecounter
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 30.7.2021, 14:47
Сообщение #6


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Cockney, спасибо конечно, я не сомневался в Ваших познаниях. Вот только Вы мои точно преувеличиваете. Я с этой хренью буду до Нового года разбираться, хотя мне понравились наносекунды, но мне бы лучше рабочий примерчик с милли ... В любом случае спасибо парни!
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 30.7.2021, 14:54
Сообщение #7


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21062
Пользователь №: 16.156



Ну первая ссылка - готовый делфи модуль. А с вызовом функции все просто. На сколько помню примерно так можно:

Var
T1, t2, freq: int64;
Begin
QueryPerformanceCounter (t1);
// Calc
QueryPerformanceCounter (t2);
// Частота процессора
QueryPerformanceFrequency(freq);
// Разница в мс
((T2-t1) div freq) div 1000;
End;

Пишу с телефона, не удобно. Но логика такая.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 30.7.2021, 14:57
Сообщение #8


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Да зачем мне в делфи. Мне хотелось бы прямо в Пилоте получить "условное" число, засечь старт. Выполнив действие получить второе "условное" число. Их разница и есть время выполнения, устроят любые величины, хоть такты камня.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 30.7.2021, 14:59
Сообщение #9


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21062
Пользователь №: 16.156



Ну так я показал последовательность вызовов, а как оно в луа через ffi вызывается я не знаю, да и не хочу знать. Может быть cirus подскажет.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 30.7.2021, 15:02
Сообщение #10


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



ОК. Я понял, спасибо. Понятно, что возможность есть, если дойдут руки и мозги не свихну ...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 30.7.2021, 15:06
Сообщение #11


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21062
Пользователь №: 16.156



Вроде оно https://gist.github.com/luastoned/c820a5c1d...1d2f1acf2b28e22
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 30.7.2021, 15:09
Сообщение #12


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



СПАСИБО. Буду пробовать.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 30.7.2021, 15:30
Сообщение #13


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26708
Пользователь №: 16.971
Возраст: 29



Код
--lua
local ffi = require("ffi")
ffi.cdef([[
int QueryPerformanceCounter(int64_t *lpPerformanceCount);
int QueryPerformanceFrequency(int64_t *lpFrequency);
]])

local function QueryPerformanceCounter(int64)
    int64 = int64 or ffi.new("int64_t[1]")
    ffi.C.QueryPerformanceCounter(int64)
    return tonumber(int64[0])
end
local function QueryPerformanceFrequency(int64)
    int64 = int64 or ffi.new("int64_t[1]")
    ffi.C.QueryPerformanceFrequency(int64)
    return tonumber(int64[0])
end

local t1 = QueryPerformanceCounter()
wait (1)
local t2 = QueryPerformanceCounter()
local t = (t2-t1) / QueryPerformanceFrequency() / 1000
log (string.format("%.10f", t))
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 30.7.2021, 15:48
Сообщение #14


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Спасибо, да, я уже попробовал, всё работает ну просто как часы. Спасибо парни, просто супер. Теперь всё будет 100%.

Об одном жалею ... ну чего же я сразу не спросил ... Теперь getimage + засечка времени = 0 миллисекунд - абсолютная точность - 100% достоверность определения событий!! Огромное вам парни спасибо!
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 30.7.2021, 16:35
Сообщение #15


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Код
--lua
local ffi = require("ffi")
ffi.cdef([[
int QueryPerformanceCounter(int64_t *lpPerformanceCount);
int QueryPerformanceFrequency(int64_t *lpFrequency);
]])

local function QueryPerformanceCounter(int64)
    int64 = int64 or ffi.new("int64_t[1]")
    ffi.C.QueryPerformanceCounter(int64)
    return tonumber(int64[0])
end
local function QueryPerformanceFrequency(int64)
    int64 = int64 or ffi.new("int64_t[1]")
    ffi.C.QueryPerformanceFrequency(int64)
    return tonumber(int64[0])
end

local function WAIT(v)
  local t1=math.modf(1000*QueryPerformanceCounter()/freq)
  while math.modf(1000*QueryPerformanceCounter()/freq)-t1<v do
  end
end

freq=QueryPerformanceFrequency()
local t1=math.modf(1000*QueryPerformanceCounter()/freq)
--wait(2)
WAIT(2)
local t2=math.modf(1000*QueryPerformanceCounter()/freq)
log(t2-t1)

Кстати про стандарт wait, если не лень можете сравнить работу стандартного и "доморощенного". Даже говорить не о чем - небо и земля.

Ещё раз огромнейшее спасибо. Просто не нарадуюсь. Я максималист и терпеть ненавижу неопределённости. Всё должно быть абсолютно точно, иначе будут разваливаться мосты, падать самолёты ...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 30.7.2021, 16:55
Сообщение #16


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26708
Пользователь №: 16.971
Возраст: 29



Такой wait грузит ядро на 100%. Что делает его бессмысленным в большинстве случаев.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 30.7.2021, 17:45
Сообщение #17


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Ну я использовал wait в своих скриптах только в одном случае, надо было ЛКМ зажать на время, всё остальное я контролирую сам, даже клики мышкой делаются специальными функциями. Не увидел особой зависимости загрузки камня, может на пару процентов. Основной скрипт у меня примерно берёт 7-12% загрузки (6 ядер 12 потоков). Запустил параллельно свой wait - прибавилось пару процентов. Да и какая разница какая загрузка, если всё равно приходится ждать, ну разве другим прогам меньше достаётся. Ну и опять же если кому-то надо ждать часами, не вопрос, можно и стандартный использовать, хотя я бы лучше воспользовался в таком случае планировщиком. Нужна точность - вопрос решён, не нужна - вопросов и не было. Мне важен был таймер, а wait я смонтировал за пару минут, чтобы просто удостовериться в точности результатов и они меня не просто устраивают, а дают совершенно иные возможности.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 30.7.2021, 19:40
Сообщение #18


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21062
Пользователь №: 16.156



Цитата(sutra @ 30.7.2021, 17:45) *

Да и какая разница какая загрузка, если всё равно приходится ждать



Проблемы обычно вылезают откуда не ждешь, и такой метод ожидания одна из таких дыр. Это работает, но только пока.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 25.4.2024, 14:39
Designed by Nickostyle