far.Timer: задержка и накопление событий

Здесь обсуждается всё, что касается макросов.
User avatar
zg
zero-gravity
Posts: 6207
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 206 times
Contact:

Таймер и сборка мусора

Post by zg »

Latest post of the previous page:

John Doe wrote: Thu 16 Jan, 2025 00:49что-то тормозит непонятно почему, и нельзя исключить, что виноват его скрипт.
не что-то, а браузер. почему вы скрипт, который практически ничего не делает — подозреваете, а какой-нибудь роскомнадзор — нет?
John Doe wrote: Thu 16 Jan, 2025 00:49На прошлой странице, там где вы исключаете образовывание очереди вызовов
я ошибочно понял, что вы имеете собственный обработчик таймера, а не что-то другое. это говорит лишь о моих проблемах в понимании людей, а не о проблемах в понимании того, как работает far.Timer.
John Doe wrote: Thu 16 Jan, 2025 00:49но теоретическая возможность есть
нет.

Code: Select all

local t1=Far.UpTime
for ii=1,200 do
  DiskPrintList()
end
t1=Far.UpTime-t1
far.Show(t1)
у меня выполняется за 11 миллисекунд. т.е. если фар тупил даже 10 секунд, то всё накопившееся выполнится за 11 миллисекунд. и мне очень сильно кажется, что это не то место, где стоит искать причину тормозов браузера.
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

Таймер и сборка мусора

Post by John Doe »

Пример ваш призван доказать что обсуждаемый скрипт не может вызвать заметного торможения.
Но для этого его должен запускать топикстартер, и как раз в момент когда он наблюдает у себя торможение системы.
GetLogicalDriveStringsW для меня чёрный ящик, и какие там могут быть задержки, и по какой причине - предполагать я не имею оснований.

И результат такового теста мне хоть и интересен, но не принципиален, поскольку в целом и общем потенциальная проблема никуда не девается: в подобном скрипте запросто может оказаться более существенная нагрузка, которую нежелательно многократно выполнять заведомо вхолостую.

P.S.
О Роскомнадзоре я как-то вообще думать не привык, да и топикстартер всё же изначально жалуется на торможение компа.
Другое дело что у этого может быть масса причин (сам я в таких случаях в первую очередь подозреваю Windows Defender и прочие сервисы системы). О Роскомнадзоре я как-то вообще думать не привык, да и топикстартер всё же изначально жалуется на торможение компа.
Другое дело что у этого может быть масса причин (сам я в таких случаях в первую очередь подозреваю Windows Defender и прочие сервисы системы).
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

Таймер и сборка мусора

Post by John Doe »

Простейший скрипт, позволяющий оценить насколько часто и в каких именно случаях бывают задержки с ACTL_SYNCHRO.
Выводит сообщение в системный журнал если обнаруживает задержку периодичности вызова более чем в 2 раза.

Code: Select all

local first = Far.UpTime
local last = first
local quant = 50
far.Timer(quant, function (t)
  local time = Far.UpTime
  if time-last> quant*2 then
    win.OutputDebugString(time-last)
  end
  last = time
end)
Проверил копирование, и убедился, что мой обработчик вызывается лишь в конце, а значит в самом процессе копирования невыполненные коллбэки накапливаются в очереди.
Копирование может быть длительным, а значит по его завершению очередь может вырасти до гигантских размеров.
Не исключено что возможно и переполнение.

Другие ситуации не анализировал, разве что с первого взгляда видно провалы от 100 до 500мс при переключении по AltTab.
https://t.me/FarManager — Telegram чат
User avatar
zg
zero-gravity
Posts: 6207
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 206 times
Contact:

Таймер и сборка мусора

Post by zg »

John Doe wrote: Thu 16 Jan, 2025 11:38Но для этого его должен запускать топикстартер, и как раз в момент когда он наблюдает у себя торможение системы.
нет.
John Doe wrote: Thu 16 Jan, 2025 11:38GetLogicalDriveStringsW для меня чёрный ящик, и какие там могут быть задержки, и по какой причине - предполагать я не имею оснований.
глобальная для юзера битовая маска. какие могут быть задержки прочитать dword из памяти?
John Doe wrote: Thu 16 Jan, 2025 11:38О Роскомнадзоре я как-то вообще думать не привык, да и топикстартер всё же изначально жалуется на торможение компа.
нет.
John Doe wrote: Thu 16 Jan, 2025 14:55Копирование может быть длительным, а значит по его завершению очередь может вырасти до гигантских размеров.
так ClickToDrive.lua работает только в shell, там такой проблемы нет.
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

Таймер и сборка мусора

Post by John Doe »

zg wrote: Thu 16 Jan, 2025 16:29нет
Чёрным по белому:
buniak_a_h wrote: Tue 14 Jan, 2025 23:48 У меня создалось впечатление, что через довольно короткое время комп начинает тормозить.
zg wrote: Thu 16 Jan, 2025 16:29 нет.
И если у вас есть инсайды (или иные соображения) о реализации системных функций это замечательно, но не означает что они автоматически у всех есть.
zg wrote: Thu 16 Jan, 2025 16:29 так ClickToDrive.lua работает только в shell, там такой проблемы нет.
Ура. Я тоже могу привести примеры где такой проблемы нет, но это никак не поможет в случаях когда она есть.

Факт того что проблема возможна в принципе достаточен как по мне для того, чтобы подумать о простейшем усовершенствовании таймера.
https://t.me/FarManager — Telegram чат
Shmuel
Posts: 7243
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 635 times

Таймер и сборка мусора

Post by Shmuel »

John Doe wrote: Thu 16 Jan, 2025 14:55 Простейший скрипт, позволяющий оценить насколько часто
У меня пока вроде не было проблем с таймером. Однако та особенность таймера, которая вам мешает, может быть легко обойдена в коде макроса:

Code: Select all

far.Timer(period, function(hnd, data)
    local upt = Far.UpTime
    if upt - data.last < period then return end
    data.last = upt
    -- do the useful work
  end, { last=0 })
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

Таймер и сборка мусора

Post by John Doe »

@shmuel
Вы правы. И такой код должен быть по крайней мере в 99% таймеров, ну и в мануале случай должен быть отдельно описан, так как сам по себе из текущего текста мануала он не вытекает.

Или же просто улучшить реализацию таймера. При этом даже не понадобиться получать текущее время и сравнивать его с предыдущим. Достаточно будет лишь булевого значения: если предыдущий вызов ещё не выполнен, то новый в очередь не ставим.
https://t.me/FarManager — Telegram чат
Shmuel
Posts: 7243
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 635 times

Таймер и сборка мусора

Post by Shmuel »

John Doe wrote: Thu 16 Jan, 2025 18:20 такой код должен быть по крайней мере в 99% таймеров
Ну у меня до сих пор как-то и без этого кода таймер нормально работает.
John Doe wrote: Thu 16 Jan, 2025 18:20 просто улучшить реализацию таймера
Это не так просто, как кажется.
Если найдёте ссылку на подобную фичу у Майкрсофта, Питона или ещё кого-то, интересно будет взглянуть.
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

Таймер и сборка мусора

Post by John Doe »

Shmuel wrote: Thu 16 Jan, 2025 18:38 Ну у меня до сих пор как-то и без этого кода таймер нормально работает.
Выполняя временами лишнюю работу.

И как вы поймёте если в отдельных случаях он сработает "ненормально"?
Очевидно это будет что-то типа подземного стука, проявляющегося в редких обстоятельствах, которые с наскоку и не воспроизвести никак.
Shmuel wrote: Thu 16 Jan, 2025 18:38 Это не так просто, как кажется.
Если действительно окажется что это технически сложно, тогда ничего не останется кроме как задокументировать и оставить как есть.
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

Таймер и сборка мусора

Post by John Doe »

Shmuel wrote: Thu 16 Jan, 2025 18:38 Если найдёте ссылку на подобную фичу у Майкрсофта, Питона или ещё кого-то, интересно будет взглянуть.
Вот что есть в JS: А вот что говорит Gemini о других языках:
https://t.me/FarManager — Telegram чат
User avatar
zg
zero-gravity
Posts: 6207
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 206 times
Contact:

Таймер и сборка мусора

Post by zg »

John Doe wrote: Thu 16 Jan, 2025 18:09Чёрным по белому:
вырываете слова из контекста. наиболее широко сформулированную часть, не несущую никакой полезной информации. вся полезная информация в последнем предложении:
buniak_a_h wrote: Tue 14 Jan, 2025 23:48 У меня создалось впечатление, что через довольно короткое время комп начинает тормозить. Возможно, это - субъективно, т.к. заметно больше всего при работе браузера, а его скорость зависит, в частности, и от сети.
John Doe wrote: Thu 16 Jan, 2025 18:09но это никак не поможет в случаях когда она есть.
вы так и не привели реальный пример.
John Doe wrote: Thu 16 Jan, 2025 18:09Факт того что проблема возможна в принципе достаточен как по мне для того, чтобы подумать о простейшем усовершенствовании таймера.
думайте, зачем писать?
John Doe wrote: Thu 16 Jan, 2025 18:20И такой код должен быть по крайней мере в 99% таймеров
откуда цифры?
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

Таймер и сборка мусора

Post by John Doe »

zg wrote: Thu 16 Jan, 2025 22:43 вырываете слова из контекста
В этом могу упрекнуть вас: комп тормозит, хз почему, а вы хватаетесь за единственную приведённую в самом конце (видимо от безнадёги) идею, в которую сам топикстартер не слишком верит (иначе зачем топик создавал).
zg wrote: Thu 16 Jan, 2025 22:43 вы так и не привели реальный пример.
Реальный пример чего? Я вижу проблему в самом факте того, что в настоящий момент код фигачит вхолостую в ряде ситуаций, а в документации даже примечания нет о возможности этого.
А вы отвечаете "ну и пусть, что тут может пойти не так".
zg wrote: Thu 16 Jan, 2025 22:43 думайте, зачем писать?
Например чтобы сообщить о надуманном. Решение предложено.
Реализовать его на C++ пока что выходит за рамки моих компетенций.
zg wrote: Thu 16 Jan, 2025 22:43откуда цифры?
Субъективное впечатление.
Но можем и объективное исследование провести: пусть каждый из заинтересованных участников форума сделает grep по своему коду, и посчитает в скольки вхождениях таймер должен осмысленно срабатывать именно так как это реализовано сейчас.
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4559
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 242 times
Been thanked: 674 times
Contact:

Таймер и сборка мусора

Post by buniak_a_h »

Господа!
  1. Торможение было особенно заметно при запуске нескольких экземпляром ФАРа.
  2. Я немного переделал скрипт (не опубликован ещё) таким образом, что таймер создаётся в обработчике ConsoleEvent, а в обработчике OnTimer он закрывается и удаляется (= nil). Опять же чисто субъективно, но комп тормозить перестал. От слова совсем.
Резюмирую. Одно из двух: либо субъективное ощущение не подкреплено объективными замерами, либо первоначальный текст скрипта был не очень корректен.
Shmuel
Posts: 7243
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 635 times

Таймер и сборка мусора

Post by Shmuel »

buniak_a_h wrote: Fri 17 Jan, 2025 00:51 Торможение было особенно заметно при запуске нескольких экземпляром ФАРа.
Поставил ваш скрипт последней версии (1.2.6), запустил 5 экземпляров Фара.
Таск менеджер показывает 0% CPU на каждом из Фаров.
Если что-то делать мышкой, возрастает до 0.1-0.2 процентов только для того Фара, где это делаешь.
Субъективно: никаких тормозов не ощутил. Может быть надо было запустить 50 Фаров...

Второй опыт: изменил ваш скрипт, сделал цикл, создающий 20 таймеров и соответственно 20 эвентов.
CPU в состоянии покоя мыши = 0.1 - 0.7 %, если елозить мышью, то 1.1 - 1.8 %.
Это не те показатели, при которых ощущается торможение.
Last edited by Shmuel on Fri 17 Jan, 2025 03:25, edited 1 time in total.
User avatar
zg
zero-gravity
Posts: 6207
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 206 times
Contact:

Таймер и сборка мусора

Post by zg »

John Doe wrote: Thu 16 Jan, 2025 23:13В этом могу упрекнуть вас: комп тормозит, хз почему, а вы хватаетесь за единственную приведённую в самом конце (видимо от безнадёги) идею, в которую сам топикстартер не слишком верит (иначе зачем топик создавал).
я, в отличии от вас, телепатией не обладаю, поэтому пока этот наезд пропустим.
John Doe wrote: Thu 16 Jan, 2025 23:13Реальный пример чего? Я вижу проблему в самом факте того, что в настоящий момент код фигачит вхолостую в ряде ситуаций, а в документации даже примечания нет о возможности этого.
первое примечание.
John Doe wrote: Thu 16 Jan, 2025 23:13А вы отвечаете "ну и пусть, что тут может пойти не так".
где я такое писал?
John Doe wrote: Thu 16 Jan, 2025 23:13Например чтобы сообщить о надуманном. Решение предложено.
Реализовать его на C++ пока что выходит за рамки моих компетенций.
вы пытаетесь чинить то, что не сломано, якобы заботясь об эффективности. но тут есть проблема. вполне может оказаться, что в конкретной ситуации частное решение может оказаться гораздо эффективней вашего общего. таких реально полезных ситуаций вполне может оказаться не так уж много и смысла что-то менять в luafar'е может и не быть.
John Doe wrote: Thu 16 Jan, 2025 23:13Субъективное впечатление.
не вижу тут даже намёка на субъективность:
John Doe wrote: Thu 16 Jan, 2025 18:20Вы правы. И такой код должен быть по крайней мере в 99% таймеров
John Doe wrote: Thu 16 Jan, 2025 18:20Но можем и объективное исследование провести: пусть каждый из заинтересованных участников форума сделает grep по своему коду, и посчитает в скольки вхождениях таймер должен осмысленно срабатывать именно так как это реализовано сейчас.
у меня два раза. и оба раза во время работы созданного тем же скриптом диалога. т.е. ваш фикс лучше точно не сделает. 0%.
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

Таймер и сборка мусора

Post by John Doe »

zg wrote: Fri 17 Jan, 2025 04:02 в отличии от вас, телепатией не обладаю,
Зачем же телепатия, это лишь мой способ выразить мысль образно.
Можно вместо этого ограничиться бесстрастным анализом этого текста. Например, поставив вопрос: в какой степени автор уверен, что проблема действительно связана с сетью. И первое приближение даёт у меня <50%.
zg wrote: Fri 17 Jan, 2025 04:02 не вижу тут даже намёка на субъективность:
Вы предпочли бы чтобы я везде вставлял "ИМХО"?
zg wrote: Fri 17 Jan, 2025 04:02где я такое писал?
Снова моё образное саммари, извините. Значит на самом деле у вас другое мнение? Пожалуйста поправьте меня тогда.
zg wrote: Fri 17 Jan, 2025 04:02 вы пытаетесь чинить то, что не сломано, якобы заботясь об эффективности.
В общем и целом у таймера заметных проблем с эффективностью нет. А заботит меня то, что его реализация оставляет возможность крайних случаев, совершенно неочевидных из упомянутого вами Примечания 1.
И проявления этих крайних случаев будут опять же неочевидные, что делает их диагностику затруднительной.
Именно это меня занимает, а вовсе не средняя производительность.
zg wrote: Fri 17 Jan, 2025 04:02 вполне может оказаться, что в конкретной ситуации частное решение может оказаться гораздо эффективней вашего общего
Нельзя ли проиллюстрировать каким-нибудь, пусть и условным, примером? Потому что пока что я совсем не понял вашу мысль.
zg wrote: Fri 17 Jan, 2025 04:02 у меня два раза. и оба раза во время работы созданного тем же скриптом диалога. т.е. ваш фикс лучше точно не сделает. 0%.
Тут важно другое: станет ли вашим кейсам хуже от моего фикса? Нельзя ли конкретный пример, вдруг мы о разном говорим.
https://t.me/FarManager — Telegram чат
Post Reply

Return to “Обсуждение макросов”