Помощь - Поиск - Пользователи - Календарь
Полная версия: Проверка скорости обработки
UoKit.com Форумы > Кликер > UO Pilot
Страницы: 1, 2
Levo222
Есть ли разница в Lua между скоростью обработки
информации внутри цикла в таком формате:
Код

local G = color (100, 100)
local R = color (200, 200)
While 1 do
  if G == 0 then
    1
  else
    if R == 0 then
      2
    else
    end
  end
end

В отличие от такого:???
Код

While 1 do
  if color (100, 100) == 0 then
    1
  else
    if color (200, 200) == 0 then
      2
    else
    end
  end
end


Это пара переменных. А если блоков несколько, и они состоят из нескольких десятков сочетающихся между собой? Если ли разница в скорости при выходе за пределы цикла?
Может есть способ замерить милисекунды и погонять чтобы проверить наглядно?
cirus
Цитата
Есть ли разница в Lua между скоростью обработки

Если вызываются функции пилота, то скорость вообще нет смысла замерять. Тем более вызов функций, которые получают цвет в экрана, это как минимум 16 мсек, с аэро 33 мсек, с привязкой быстрее, но все-равно это занимает много времени по сравнению с любыми операциями в луа.
Цитата
Может есть способ замерить милисекунды и погонять чтобы проверить наглядно?

Код
--lua
local t = os.clock()
for i = 1, 1000000000 do  -- миллиард итераций
    if i == 1 then
    end
end
log ('Затрачено времени: ' .. string.format("%.3f", os.clock() - t) .. ' секунд')
Levo222
Цитата(cirus @ 10.6.2020, 16:21) *

Если вызываются функции пилота, то скорость вообще нет смысла замерять. Тем более вызов функций, которые получают цвет в экрана, это как минимум 16 мсек, с аэро 33 мсек, с привязкой быстрее, но все-равно это занимает много времени по сравнению с любыми операциями в луа.


Я ничего не понял. Какая разница между функциями Lua и функциями пилота? Вы имеете ввиду старый язык до версии 3.02?

Цитата(cirus @ 10.6.2020, 16:21) *

с привязкой быстрее

Это касается Delphy или вобще любых операций в пилоте?

Я че-то не догоняю: Есть Lua, Есть Lua через пилот, Есть Lua через другие компиляторы. Есть другие языки через Pilot, есть другие языки через другие компиляторы.
Какие из функций относятся к медленным независимо от использования того иного языка и относятся чисто к пилоту?
cirus
Все функции пилота вызываются медленно.
Код
--lua
log 'clear' log 'mode compact'
local t = os.clock()
for i = 1, 10000 do
    local x = power(2, 5)   -- вызов функции пилота
end
log ('Затрачено времени: ' .. string.format("%.3f", os.clock() - t) .. ' секунд')


t = os.clock()
for i = 1, 10000 do      -- можно добавить нулей
    local x = math.pow(2, 5)  -- вызов функции луа
end
log ('Затрачено времени: ' .. string.format("%.3f", os.clock() - t) .. ' секунд')

Цитата
с привязкой быстрее
Это касается Delphy или вобще любых операций в пилоте?

Имеется ввиду получение цвета с перекрытого окна.
Levo222
Цитата(cirus @ 10.6.2020, 17:53) *

Все функции пилота вызываются медленно.
Имеется ввиду получение цвета с перекрытого окна.

А не с перекрытого?

По поводу привязки имеется ввиду вписывание хэндла в скрипт?

Цитата(cirus @ 10.6.2020, 17:53) *

Код
--lua
log 'clear' log 'mode compact'
local t = os.clock()
for i = 1, 10000 do
    local x = power(2, 5)   -- вызов функции пилота
end
log ('Затрачено времени: ' .. string.format("%.3f", os.clock() - t) .. ' секунд')
t = os.clock()
for i = 1, 10000 do      -- можно добавить нулей
    local x = math.pow(2, 5)  -- вызов функции луа
end
log ('Затрачено времени: ' .. string.format("%.3f", os.clock() - t) .. ' секунд')


Цитата
1.500
0.000

Ха! я понял)

Но ведь color это Lua функция? Не пилота? У родного колора кажется findcolor? А присвоение переменных и циклы также относятся к Lua?
cirus
Цитата
Но ведь color это Lua функция?

Нет. https://uopilot.uokit.com/wiki/index.php?title=Color
Список функций, которые есть в луа есть в меню правой кнопки мыши. Хотя там не все.
Цитата
А присвоение переменных и циклы также относятся к Lua?

Да.
Levo222
Цитата(cirus @ 10.6.2020, 16:21) *

много времени по сравнению с любыми операциями в луа.


Ничего не понял. Чисто Luaшные функции есть на определение цвета? Или это прерогатива пилота?
И есть ли способ ускорить?
Levo222
Цитата(cirus @ 10.6.2020, 18:13) *

есть в меню правой кнопки мыши

Это где?
cirus
Цитата
есть в меню правой кнопки мыши
Это где?

В редакторе пилота.
Цитата
Чисто Luaшные функции есть на определение цвета?

Нет.
Цитата
Или это прерогатива пилота?

Нет. Это функции winapi.
Цитата
И есть ли способ ускорить?

При получении цвета с экрана нет. Если получать цвет с перекрытого окна, то будет быстрее.
Можно через длл https://forum.uokit.com/index.php?showtopic=69910
Или так(хотя это тоже что самое что и через длл):
Код
--lua
local ffi = require("ffi")
local user, gdi = ffi.load('User32.dll'), ffi.load('Gdi32.dll')
ffi.cdef[[
int GetDC(int hWnd);
int ReleaseDC(int hWnd, int hDC);
unsigned long GetPixel(int hdc, int x, int y);
]]
function getpixel(handle, x, y)
    local HDC = user.GetDC (handle)
    local color=gdi.GetPixel(HDC, x, y)
    user.ReleaseDC(handle, HDC)
    return color
end

local result = getpixel(workwindow(), 100, 200)
hint (result)
Levo222
Цитата(cirus @ 10.6.2020, 18:43) *

В редакторе пилота.


Ну так вот же?
Изображение
Там и те функции написаны. color тот же только с хэндлом. То что с хэндлом будет быстрее я понял, только не понял почему, и причем тут перекрытое окно.
получается если не использовать color а напрямую проверять цвет в координатах быстрее будет?
Т.е.
Код
if <100,100> <423543> then
1
else
end
Только так походу работать вообще не будет, функции то нет?

Не тоже самое что
Код
if color(100, 100) == 423543 then
1
else
end

И будет быстрее?

Цитата(cirus @ 10.6.2020, 18:43) *

Если получать цвет с перекрытого окна, то будет быстрее.

имеется ввиду если использовать handle? Или вобще прям перекрыть? А в чём трудность то?
Есть способ считать окно перекрытым, если оно будет неперекрытым? Т.е обмануть пилот?)
cirus
Цитата
Ну так вот же?

Это функции пилота. Встроенные функции луа в пункте Lua.
Цитата
Если получать цвет с перекрытого окна, то будет быстрее.
имеется ввиду если использовать handle?

Да. Окно можно не перекрывать, не влияет.
Цитата
if <100,100> <423543> then

Так нельзя, только через функцию.
Levo222
Цитата(cirus @ 10.6.2020, 19:04) *

Это функции пилота. Встроенные функции луа в пункте Lua.


А ну понятно, их если что можно взять в справке по луа? Т.е. там все поддерживаются пилотом? Или только те что под LuaJit5.1 ?
альтернативы coloru я так понимаю нет, кроме dll-ки?

Цитата
Или так(хотя это тоже что самое что и через длл):

Ну я так понял Dll это для тех у кого стандартная функция не работает, а вызывает то она также как и обычная?

Насколько быстрее
Вобще изначальный вопрос был насколько быстрее скрипт обращается к переменным за циклом обозначающим цвет точек в заданных координатах, чем к тем которые проверяются непосредственно в самом теле цикла? Я так понимаю ничем если используются стандартные функции пилота? Или там минимальная разница?

Короче есть 2 варианта ускорения:
1. привязывать handle
2. или... привязать handle))) потмоу что dll по сути тоже самое и разницы в скорости нету?
А проблем со стандартной функцией у меня нету, ну разве что мигание окна.
Я ниче не понял почему handle делает работу быстрее? Приоритет окна повышает?
cirus
Цитата
Т.е. там все поддерживаются пилотом? Или только те что под LuaJit5.1 ?

Все что для версии 5.1.
Цитата
Вобще изначальный вопрос был насколько быстрее скрипт обращается к переменным за циклом обозначающим цвет точек в заданных координатах, чем к тем которые проверяются непосредственно в самом теле цикла?

Без разницы, если не собираетесь замерять разницу в наносекунды.
Цитата
Я ниче не понял почему handle делает работу быстрее?

Другой принцип получения цвета.
Всё просто, есть 2 варианта:
1. Получать цвет с экрана, медленно.
2. Получать цвет напрямую с окна, быстрее. Насколько, зависит от приложения.
Хоть функциями пилота, хоть длл, хоть как, всё работает одинакового через функции winapi.
Levo222
Цитата(cirus @ 10.6.2020, 19:38) *

зависит от приложения.

А скорость отклика приложения отчего зависит? Если ему приоритет менять это поможет? Частота процессора? Ram? Чтение диска?
Levo222
И еще есть ли способ сразу соотнести handle со всеми переменными с координатами в скрипте? чтобы не писать каждый раз в скобках это слово?
Levo222
Цитата(cirus @ 10.6.2020, 16:21) *

минимум 16 мсек, с аэро 33 мсек, с привязкой быстрее

а....
cirus
Цитата
И еще есть ли способ сразу соотнести handle со всеми переменными с координатами в скрипте?

Нет. Неизвестно же какие переменные это координаты, а какие нет. Пишите свою функцию и не надо будет дописывать.
Код
--lua
function _move(x, y) move(x, y, workwindow()) end
function _kleft(x, y) kleft(x, y, workwindow()) end

_move(100, 100)
wait(1000)
_kleft(200, 200)
end_script()

Цитата
А скорость отклика приложения отчего зависит?

Не знаю, из предположений от фпс.
Levo222
Цитата(cirus @ 10.6.2020, 21:58) *

Не знаю, из предположений от фпс.

Фпс монитора? Или фпс самого приложения? просто они немного разные и очень сильно скачут, особенно фпс приложения, так может оказаться что через непривязанное окно считывает быстрее поскольку фпс экрана менее подвержено изменениям?

Цитата(cirus @ 10.6.2020, 21:58) *

Пишите свою функцию и не надо будет дописывать.
Код
--lua
function _move(x, y) move(x, y, workwindow()) end
function _kleft(x, y) kleft(x, y, workwindow()) end

_move(100, 100)
wait(1000)
_kleft(200, 200)
end_script()



Дак точек то много, и действий соответственно тоже, там не один Kleft а десятки клавиш.
Levo222
Цитата(cirus @ 10.6.2020, 21:58) *

какие переменные это координаты, а какие нет.

Ну к примеру?
Levo222
Так, как привязать handle через Lua? Там же другой синтаксис будет? Чет нигде примеров нету

Через #Set или local?
cirus
Цитата
Чет нигде примеров нету

Какой пример нужен? Напишите на старом синтаксисе, перепишу на луа.
Levo222
Цитата(cirus @ 11.6.2020, 14:19) *

Какой пример нужен? Напишите на старом синтаксисе, перепишу на луа.

Да я уже нашёл вроде

Почему-то хендл окна через
Код
--lua
local h = findwindow ("Блокнот")
if h then    -- если окно или несколько окон найдено
    for i = 1, #h do
        log (h[i][1])  -- показать в логе хендлы всех найденных окон
    end
end


отличается от хендла через InqSoft Window Scanner, причём там нет дочернего окна.
Как узнать какой из них реальный?

----UPD---
А я понял там хэндл в каком-то другом формате пишется, с тремя 000, какой из них вписывать?

Проще говоря мне нужно найти хэндл окна по названию, 1 раз вывести его в лог, а затем сделать рабочим, и далее использовать какую-то функцию или вставлять h в каждую переменную?
Код
local G = color (100, 100 h)

Или какой из этих способов привязки самый простой? чтобы один раз вписать в скрипт и забыть про привязку даже при изменении хэндла окна?
+ к этому включение/остановку скрипта(как я понял в этой https://forum.uokit.com/index.php?showtopic=70282 теме) можно использовать
set hotkeystart {Клавиша}
перед --lua чтобы можно было отключать его.
Не будет ли это тормозом при обработке Lua событий в теле скрипта после --Lua?
cirus
Цитата
причём там нет дочернего окна.

У блокнота есть, редактор это дочернее окно. Ctrl+A над заголовком это то что находит findwindow.
Цитата
Проще говоря мне нужно найти хэндл окна по названию, 1 раз вывести его в лог, а затем сделать рабочим

На вики findwindow, первый пример.
Цитата
Не будет ли это тормозом при обработке Lua событий в теле скрипта после --Lua?

Нет.
Цитата
local G = color (100, 100 h)

Все параметры пишутся через запятую.
Цитата
А я понял там хэндл в каком-то другом формате пишется, с тремя 000, какой из них вписывать?

Выбрать отображать десятичные хендлы.
Levo222
Цитата(cirus @ 11.6.2020, 14:52) *

У блокнота есть, редактор это дочернее окно. Ctrl+A над заголовком это то что находит findwindow.


Да там не блокнот, но уже понятно что через пример нормально находит

Цитата(cirus @ 11.6.2020, 14:52) *

Выбрать отображать десятичные хендлы.

В этой версии нет десятиричных хэндлов, или я не там смотрю.
А всё, там ПКМ по самому числу вид меняет.

И еще если я напишу километровое название переменной его обработка отличиться от односимвольного?
cirus
Цитата
И еще если я напишу километровое название переменной его обработка отличиться от односимвольного

Что мешает проверить? Запустите цикл на миллиард итераций и сравните время выполнения.
Levo222
Цитата(cirus @ 11.6.2020, 15:10) *

Что мешает проверить? Запустите цикл на миллиард итераций и сравните время выполнения.

Ладно, это сделаю, а вот еще как узнать какая именно часть скрипта наиболее затратна по времени? Т.е. обращение к ней и обработка занимает наибольшую долю?

Цитата(cirus @ 11.6.2020, 15:10) *

Что мешает проверить? Запустите цикл на миллиард итераций и сравните время выполнения.


ОХОХО....

Код
local t = os.clock()
local G = color (100, 100, h)
local R = color (200, 200, h)
for i = 1, 10000 do
  if G == 0 then
    a = 1
  else
    if R == 0 then
     a = 2
    else
    end
  end
end
log ('Затрачено времени: ' .. string.format("%.3f", os.clock() - t) .. ' секунд')


t = os.clock()
for i = 1, 10000 do
  if color (100, 100, h) == 0 then
   b = 1
  else
    if color (200, 200, h) == 0 then
     b = 2
    else
    end
  end
end
log ('Затрачено времени: ' .. string.format("%.3f", os.clock() - t) .. ' секунд')


Цитата
log
Затрачено времени: 0.000 секунд
Затрачено времени: 5.765 секунд


Вот это засада, а почему никто раньше не говорит что время исполнения в 5 раз выше при помещении переменных внутрь цикла?

Вот об этом я и говорю, что есть некоторая информация известная всем кто давно занимается заставляющая по 3 дня ломать рога в поисках проблемы оптимизации какой-нибудь переменной, написанной в неверном формате и приводящей к лагам, которая при озвучивании могла бы уберечь от ненужных действий.
cirus
Код ошибочный. В первом цикле цвет не проверяется, только значение переменной.
Цитата
а вот еще как узнать какая именно часть скрипта наиболее затратна по времени?

Все функции, которые работают с цветом, color, findcolor, findimage.
Ускорить скрипт можно если не использовать функции пилота.
Levo222
Цитата(cirus @ 11.6.2020, 16:05) *

Код ошибочный. В первом цикле цвет не проверяется, только значение переменной.

Вот это я<вырезано анти-матом>)

Ну и ладно
Хоть за километровые значения переменных узнали что почти нет разницы
Код
local t = os.clock()
local Gcer5vew53b5vb4e456vb3525b3t634wbtweb53w45345bq35ertwbt = color (100, 100, h)
local Rrntyriybes54v2warvw6be6e5b64e64646eb5a45byrbybrybeybrsy = color (200, 200, h)
for i = 1, 10000000000 do
  if Gcer5vew53b5vb4e456vb3525b3t634wbtweb53w45345bq35ertwbt == 0 then
    a = 1
  else
    if Rrntyriybes54v2warvw6be6e5b64e64646eb5a45byrbybrybeybrsy == 0 then
     a = 2
    else
    end
  end
end

log ('Затрачено времени: ' .. string.format("%.3f", os.clock() - t) .. ' секунд')


local t = os.clock()
local G = color (100, 100, h)
local R = color (200, 200, h)
for i = 1, 10000000000 do
  if G == 0 then
    a = 1
  else
    if R == 0 then
     a = 2
    else
    end
  end
end
log ('Затрачено времени: ' .. string.format("%.3f", os.clock() - t) .. ' секунд')

Цитата

Затрачено времени: 11.844 секунд
Затрачено времени: 11.859 секунд

Даже с меньшими символами дольше. Может потому что приоритет вышенаписанному в обработке отдаётся?

Цитата(cirus @ 11.6.2020, 16:05) *

Код ошибочный. В первом цикле цвет не проверяется

Как будет выглядеть нормальный код?)

Цитата(cirus @ 11.6.2020, 16:05) *

если не использовать функции пилота.

А если через другой компилятор? Есть варианты?
c
В Autoit вроде видел похожие функции
Levo222
Цитата(cirus @ 11.6.2020, 16:05) *

Все функции, которые работают с цветом

А вот что меня интересует - время проверки определённого участка кода:
Код
local t = os.clock()
local G = color (100, 100, h)
local R = color (200, 200, h)
for i = 1, 1000 do
    Засечь начало здесь
  if G == (0) then
    a = 1
  else
    if R == (0) then
     a = 2
    else
    end
Засечь окончание здесь
  end
end
log (' Вывести в лог ' .. время промежутка .. '')
log ('Затрачено времени: ' .. string.format("%.3f", os.clock() - t) .. ' секунд')
Fors1k
Цитата(Levo222 @ 11.6.2020, 12:19) *
Как будет выглядеть нормальный код?)

Код
--lua
log"clear"
t = os.clock()
h = findwindow("Блокнот")[1][1]
function G() return(color (156, 102, h)) end
function R() return(color (369, 260, h)) end
for i = 1, 1000 do
    if G() == 0 then
        a=1
    end
    if R() == 0 then
        a=2
    end
end
log ('Затрачено времени: ' .. string.format("%.3f", os.clock() - t) .. ' секунд')
log(" ")
t = os.clock()
for i = 1, 1000 do
    if color (229, 233, h) == 0 then
        a=1
    end
    if color (767, 370, h) == 0 then
        a=2
    end
end
log ('Затрачено времени: ' .. string.format("%.3f", os.clock() - t) .. ' секунд')

Цитата
Затрачено времени: 11.210 секунд

Затрачено времени: 13.795 секунд

Цитата(Levo222 @ 11.6.2020, 12:53) *
А вот что меня интересует - время проверки определённого участка кода:

Код
--lua
log "clear"
--code
t = os.clock()       -- Засечь начало здесь
--code
--code
--code
t1=(os.clock() - t)  -- Засечь окончание здесь
--code
log ('время промежутка: '..string.format("%.3f", t1)..' секунд')
cirus
Если уж речь идет о скорости, то не используйте глобальные переменные, доступ к локальным быстрее.
Fors1k
Цитата(cirus @ 11.6.2020, 13:36) *

Если уж речь идет о скорости, то не используйте глобальные переменные, доступ к локальным быстрее.

Раз уж сегодня день замеров, то проверим кодом и этот тезис)
Мои ставки были, что результат будет ~одинаковым.
Помучаем отдельно глобальную и локальную переменную:
Код
--lua
log"clear"
a=4
tAverage1=0
for c=1, 3 do
t = os.clock()
for i=1, 1000000000 do
    a=a*2
    a=a/2
end
t1=(os.clock() - t)
tAverage1=tAverage1+t1
end
log ('Global Var: '..string.format("%.3f", tAverage1/3)..' секунд')
log" "
local b=4
tAverage2=0
for c=1, 3 do
t = os.clock()
for i=1, 1000000000 do
    b=b*2
    b=b/2
end
t2=(os.clock() - t)
tAverage2=tAverage2+t2
end
log ('Loacal Var: '..string.format("%.3f", tAverage2/3)..' секунд')

Цитата
Global Var: 2.377 секунд

Loacal Var: 2.607секунд

Работа с глобальными переменными оказалась быстрее на 10%.
Cockney
Цитата(Fors1k @ 11.6.2020, 14:14) *

Работа с глобальными переменными оказалась быстрее на 10%.




На сколько понимаю - это частный случай. Чем больше глобальных переменных тем медленней работа. Я не эксперт луа, но как по мне, в тесте переменные в одной области лежат.
Fors1k
Цитата(Cockney @ 11.6.2020, 14:56) *
На сколько понимаю - это частный случай.
Тоже так думаю, хотя специально сделал 3 замера каждому.
Цитата(Cockney @ 11.6.2020, 14:56) *
как по мне, в тесте переменные в одной области лежат.
Независимо от области видимости, локальные и глобальные переменные хранятся в разных местах памяти, хотя это неважно, так как в проверяемом тезисе сказано, что сам факт обращения к нелокальной переменной требует больше времени.
Цитата(Cockney @ 11.6.2020, 14:56) *
Я не эксперт луа

Я тоже, поэтому и предпочел все узнать на деле) Что ж, проведем эксперимент с новыми условиями.
Количество замеров увеличим с 3 до 300, испытуемые переменные будут находиться в разных областях видимости:
Код
--lua
log"clear"
tAverage1=0
for c=1, 300 do
    a=4
    t = os.clock()
    for i=1, 10000000 do
        a=a*2
        a=a/2
    end
    t1=(os.clock() - t)  
    tAverage1=tAverage1+t1
end
log ('Global Var: '..string.format("%.5f", tAverage1/300)..' секунд')
log" "
tAverage2=0
for c=1, 300 do
    local b=4
    t = os.clock()
    for i=1, 10000000 do
        b=b*2
        b=b/2
    end
    t2=(os.clock() - t)
    tAverage2=tAverage2+t2
end
log ('Loacal Var: '..string.format("%.5f", tAverage2/300)..' секунд')
-- Убедимся, что переменные были в разных областях видимости
log(a)
log(b)
Цитата
Global Var: 0.02448 секунд

Loacal Var: 0.02691 секунд
4
nil

Работа с глобальной переменной снова оказалась быстрее на 10%. Опять 10%, причем при 300х замерах. Такой результат уже можно считать стабильностью, хотя я все-таки ожидал увидеть (+/- )1-2%.
Cockney
Тест не совсем корректен. Под увеличением числа переменных я имел в виду:
Код

local a_1
local a_2
....
local a_n


и последующие обращение к ним.

Касательно областей памяти. Да, они лежат в разных областях памяти. Но именно в данном тесте это скорее всего не так. Что я имею в виду:

Код

--lua
a = 0
local b = 1


Где лежит b ? Почему в разных, если область памяти пока только одна - глобальная.

А теперь такой вариант

Код

--lua
//global mem
a = 0

function f()
   //local mem
   local b = 0
   return b
end

//global mem
local res = f()



Здесь, при вызове функции будет сформирована своя область памяти, изолированная от глобальное, и уже в ней будет лежать b.

Следовательно, локальная область памяти будет содержать только b, в то время как глобальная будет содержать a, res и еще кучу системных переменных которые задаются не явно. Что в итоге и скажется на производительности.

Собственно, кажется это и подтверждение моих соображений:

https://www.lua.org/pil/4.2.html

Код

--lua
local a = 0


Означает что переменная глобальна для всего скрипта, но из других скриптов она не видна.
Levo222
Цитата(Fors1k @ 11.6.2020, 17:16) *

Код

set hotkeystart {End}
--lua
log 'clear' log 'mode compact'
local h = findwindow ("Блокнот")
if  h then
    workwindow (h[1][1])
    end
function G() return(color (156, 102, h)) end
function R() return(color (369, 260, h)) end
for i = 1, 1000 do
    if G() == 0 then
        a=1
    end
    if R() == 0 then
        a=2
    end
end
log ('Затрачено времени: ' .. string.format("%.3f", os.clock() - t) .. ' секунд')
log(" ")
t = os.clock()
for i = 1, 1000 do
    if color (229, 233, h) == 0 then
        a=1
    end
    if color (767, 370, h) == 0 then
        a=2
    end
end
log ('Затрачено времени: ' .. string.format("%.3f", os.clock() - t) .. ' секунд')


У меня вобще так ошибку выдаёт...
Хоть с локальными хоть с глобальными.
Где-то читал что функции не относятся к глобальным в плане обращения к ним если это не происходит из разных областей данных или они не содержат параметры, что и есть тут как мне кажется, хотя.. у меня то вообще ошибку выдаёт)
Т.е.
function G (self, callback, object, ...)
не тоже самое что
function G ()
Fors1k
Цитата(Levo222 @ 11.6.2020, 16:57) *
У меня вобще так ошибку выдаёт...

Потому, что вы неправильно скопировали код из примера.
Levo222
Цитата(Fors1k @ 11.6.2020, 21:10) *

Потому, что вы неправильно скопировали код из примера.

Ну да, вроде пошло
Но у меня обратные результаты
Код
--lua
log"clear"
local t = os.clock()
local h = findwindow("Блокнот")[1][1]
function G() return(color (111, 111, h)) end
function R() return(color (111, 111, h)) end
for i = 1, 100 do
    if G() == 0 then
        a=1
    end
    if R() == 0 then
        a=2
    end
end
log ('Затрачено времени: ' .. string.format("%.3f", os.clock() - t) .. ' секунд')
log("1 ")
local t = os.clock()
for i = 1, 100 do
    if color (111, 111, h) == 0 then
        a=1
    end
    if color (111, 111, h) == 0 then
        a=2
    end
end
log ('Затрачено времени: ' .. string.format("%.3f", os.clock() - t) .. ' секунд')

через функции работает медленнее чем без них
Цитата
Затрачено времени: 6.641 секунд
Затрачено времени: 6.578 секунд

А как присвоить локальную переменную через color без функции?
т.е
Код
local G = color (100, 100, h) 

почему возвращает данные а не значения цвета? Где-то скобку надо поставить?
cirus
Цитата
local G = color (100, 100, h)

Может надо выкладывать весь код, а не кусок.
Levo222
Цитата(cirus @ 11.6.2020, 21:50) *

Может надо выкладывать весь код, а не кусок.

Код
local t = os.clock()
local G = color (100, 100, h)
local R = color (200, 200, h)
for i = 1, 10000 do
  if G == 0 then
    a = 1
  else
    if R == 0 then
     a = 2
    else
    end
  end
end
log ('Затрачено времени: ' .. string.format("%.3f", os.clock() - t) .. ' секунд')


t = os.clock()
for i = 1, 10000 do
  if color (100, 100, h) == 0 then
   b = 1
  else
    if color (200, 200, h) == 0 then
     b = 2
    else
    end
  end
end
log ('Затрачено времени: ' .. string.format("%.3f", os.clock() - t) .. ' секунд')

Fors1k
Цитата(Cockney @ 11.6.2020, 16:10) *
Тест не совсем корректен.
Не совсем корректен относительно чего?
Тест проводился для проверки фразы:
Цитата(cirus @ 11.6.2020, 13:36) *

Если уж речь идет о скорости, то не используйте глобальные переменные, доступ к локальным быстрее.
Мы замерили 300 раз по 20млн обращений к локальной, и столько же к глобальной. Эксперимент выявил, что ситуация обратная, так что тест считаю корректным. Отмечу, что таким высказыванием забит весь интернет, так что здесь вопросы не к cirus, а к тому, кто это придумал))
Цитата(Cockney @ 11.6.2020, 16:10) *
Код
--lua
a = 0
local b = 1

Где лежит b ? Почему в разных, если область памяти пока только одна - глобальная.

Нет, здесь уже две области памяти. Следует отличать область памяти, и область видимости. Область памяти - полка в шкафу. Область видимости - разрешение заглянуть на ту или иную полку. В этом коде a и b лежат на разных полках, но дальше по коду любой будет иметь право лазить хоть на одну, хоть на другую. А теперь вопрос: стоит ли тогда просить систему строить две полки, если у всех доступ будет к обоим? Посмотрим, как это выглядит в коде:
Код
--lua
a = 5
local b = 7
log(_G.a) -- 5
log(_G.b) -- nil

Глобальные переменные хранятся в таблице _G. Как мы видим, переменная b, хоть и находится в той же области видимости, но в таблице _G ее нет. Где же она? Где-то в недрах памяти lua. Без специальных библиотек посмотреть где они лежат - невозможно, но суть в том, что не в _G. В итоге, кроме того, что мы заставили систему зачем-то строить отдельную полку для хранения b, мы ничего не добились написав перед ней local.
Levo222
Цитата(Fors1k @ 11.6.2020, 22:06) *

Тест проводился для проверки фразы:

Надо проводить тест не для проверки этой фразы а чтобы решить конкретную задачу)
Я тоже сталкивался с этой фразой, только там обрабатывалась пара десятков функций через string.match и подфункции табличных значений и кучу разных других опций, у нас всё просто, так вот может и будет разница
пока что у меня картиночка не работает что
Код
local G = color (100, 100, h) --не считается данными цвета а только значением переменной
а G == 0 --не возвращает значения цвета...
Madeus
Что-то мне подсказывает что результаты не совсем корректны, и больше похожи на погрешность. У меня как-то так, и по всей видимости сильно зависят от железа.

Код
18:43:20 3 (, 0): Global Var: 1.811 секунд
18:43:20 3 (, 0):  
18:43:26 3 (, 0): Loacal Var: 1.811 секунд


Код
18:44:46 4 (, 0): Global Var: 0.01811 секунд
18:44:46 4 (, 0):  
18:44:52 4 (, 0): Loacal Var: 0.01810 секунд
18:44:52 4 (, 0): 4
18:44:52 4 (, 0): nil
Cockney
Цитата(Fors1k @ 11.6.2020, 18:06) *

Не совсем корректен относительно чего?
Тест проводился для проверки фразы:
Мы замерили 300 раз по 20млн обращений к локальной, и столько же к глобальной. Эксперимент выявил, что ситуация обратная, так что тест считаю корректным. Отмечу, что таким высказыванием забит весь интернет, так что здесь вопросы не к cirus, а к тому, кто это придумал))



Дело не в количестве обращений. А во времени обращения к какой-то переменной, когда область памяти содержит большой объем таких переменных. Как я и приводил пример, пусть в тесте будет 10000 глобальных переменных вида:

Код

a_1 = 0
...
a_1000 = 0


а сам тест выглядит примерно так:
Код

--lua
//в глобальном контексте

a_1 = 0
a_2 = 0
a_3 = 0
a_4 = 0
//.....

t = os.clock()
a_4 = 100
timeElapsed = os.clock() - t

function f()
   //в локальном контексте
   local a_1 = 0
   local a_2 = 0
   local t = os.clock()
   a_2 = 100
   local timeElapsed = os.clock() - t
end

Fors1k
Цитата(Madeus @ 11.6.2020, 18:49) *
больше похожи на погрешность.

Да, я тоже к этому склоняюсь. Если увеличивать количечство замеров, количество различных пк, на которых проводим тесты и т.д. ,то наверное мы получим примерно одинаковый результат.
вот еще несколько замеров сделал
Global Var: 0.02728 секунд
Loacal Var: 0.02899 секунд

Global Var: 0.02856 секунд
Loacal Var: 0.02848 секунд

Global Var: 0.02667 секунд
Loacal Var: 0.02888 секунд

Практически одинаковые результаты, но global почему-то у меня все равно чуть быстрее..
Cockney
Цитата(Fors1k @ 11.6.2020, 18:06) *


Нет, здесь уже две области памяти. Следует отличать область памяти, и область видимости. Область памяти - полка в шкафу. Область видимости - разрешение заглянуть на ту или иную полку. В этом коде a и b лежат на разных полках, но дальше по коду любой будет иметь право лазить хоть на одну, хоть на другую. А теперь вопрос: стоит ли тогда просить систему строить две полки, если у всех доступ будет к обоим?


Да, моя ошибка. Сам опроверг себя, приведя ссылку на документацию.

--lua
a = 0 // глобально для всех скриптов
local b = 0// глобально только для текущего

Levo222
Цитата(Fors1k @ 11.6.2020, 23:05) *

Практически одинаковые результаты, но global почему-то у меня все равно чуть быстрее..

А у меня медленнее. Может дело в установленных у тебя множестве патчей? Один из которых меняет состояние некоторых переменных с глобальных на локальные вне скрипта?
Fors1k
Не знаю, что за патчи, у меня самый обычный пилот)
Цитата(Levo222 @ 11.6.2020, 19:21) *

А у меня медленнее.

Ну вот. У меня быстрее, у тебя медленнее, у Madeus одинаково. Итог: разницы в скорости нет.
Levo222
Цитата(Fors1k @ 11.6.2020, 23:29) *

Не знаю, что за патчи, у меня самый обычный пилот)

Ну вот. У меня быстрее, у тебя медленнее, у Madeus одинаково. Итог: разницы в скорости нет.

У меня то есть, значит проблема в конфигурации системы/конкретного приложения/ обращении к ним/через него. Т.е. надо локально проблему решать, А мне это локализовать переменные за циклом содержащие проверку цвета внутри самого цикла.
Я так и не понял что быстрее - мы пока что без функций тут не сделали способа считать данные цвета из переменной, что хотелось бы увидеть
cirus
Цитата
Я так и не понял что быстрее

Проводите нормальные тесты:
Цитата
Дело не в количестве обращений. А во времени обращения к какой-то переменной, когда область памяти содержит большой объем таких переменных.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.