Author Topic: Я не жужжу - понять просто хочу...  (Read 5537 times)

0 Members and 2 Guests are viewing this topic.

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Я не жужжу - понять просто хочу...
« on: August 18, 2018, 10:26:34 AM »
Ребят, я тут с потоками поигрался (нужда возникла скрипт ускорить) и у меня возник вопрос (может я просто чего-то упускаю) - а для чего вообще в кликермане потоки? Ведь по сути они не являются независимыми потоками и каждый поток стоит в очереди и ждет, пока закончит свой цикл предыдущий поток.

Время выполнения поиска картинки в этих условиях у меня = 400мс
Code: (clickermann) [Select]
GETSCREEN
COLORMODE(7)
$check_time=$_ms
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 50)
   
END_IF
LOGWRITE ($_ms-$check_time)

HALT

А тут у меня это время = 1200мс
Code: (clickermann) [Select]
THREAD(name1, 0)
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 50)
     
   END_IF
   WAITMS(50)
END_THREAD

THREAD(name2, 0)
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 50)
     
   END_IF
   WAITMS(50)
END_THREAD


GETSCREEN
COLORMODE(7)
$check_time=$_ms
SETTHREAD (name1, 1)
SETTHREAD (name2, 1)
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 50)
   
END_IF
LOGWRITE ($_ms-$check_time)

HALT

То есть время работы скрипта в три потока (в которых абсолютно равные условия) увеличилось ровно в три раза. В чем суть потоков? Или я чего-то не понимаю...?
Я не ду... Потому и не бу...

KingDrakonov

  • Освоившийся
  • **
  • Posts: 39
    • View Profile
Re: Я не жужжу - понять просто хочу...
« Reply #1 on: August 18, 2018, 01:13:13 PM »
ДА
Code: (clickermann) [Select]
    GETSCREEN
    COLORMODE(7)
    $check_time=$_ms
    IF_PICTURE_IN (1041,308, 1192,432, "KRS_10х10.bmp", -1, 90)  // Где искать примерно и процент точности размер картинки
     
    END_IF
    LOGWRITE ($_ms-$check_time)
     
    HALT

LCLICK(1041,308)  // Alt+Q
LCLICK(1191,432)  // Alt+Q

1041,308, 1191,432,   

поставил бы процент 10 в обще думаю состарился ты. я ниже 80 не ставлю, чаще всего ищу такое место где можно было использовать 90 или 100 процентов

экран сам 1680х1050  = 0,0, $_xmax,$_ymax     
зона поиска 1680х1050 картинка 107х106 %точности 50 вышло   432989  7-8минут    БОЮСЬ НОВЫЙ ГОД ПРОЙДЕТ     да и процессор подгружает не плохо
зона поиска 647х227 картинка 107х106 %точности 50 вышло    18408   замучаюсь ждать
зона поиска 647х227 картинка 20х20 %точности 50 вышло       1091   так себе
зона поиска 647х227 картинка 20х20 %точности 90 вышло        315   пойдет
зона поиска 647х227 картинка 20х20 %точности 100 вышло        98   хорошо
зона поиска 647х227 картинка 10х10 %точности 100 вышло        52   еще лучше
зона поиска 151х124 картинка 10х10 %точности 90 вышло         12   класс
зона поиска 151х124 картинка 10х10 %точности 100 вышло         7   супер

зона поиска 1680х1050 картинка 10х10 %точности 100 вышло         625   хорошо для всего экрана



сам решай что тебе надо

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Я не жужжу - понять просто хочу...
« Reply #2 on: August 18, 2018, 01:24:09 PM »
Ребят, я тут с потоками поигрался (нужда возникла скрипт ускорить) и у меня возник вопрос (может я просто чего-то упускаю) - а для чего вообще в кликермане потоки? Ведь по сути они не являются независимыми потоками и каждый поток стоит в очереди и ждет, пока закончит свой цикл предыдущий поток.

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

Раньше приходилось всовывать в ключевые точки вызов подпрограммы. С потоками все проще стало. Если конечно понимать как их использовать.

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Я не жужжу - понять просто хочу...
« Reply #3 on: August 18, 2018, 01:51:53 PM »
KingDrakonov, я процент спецом занизил для эксперимента. Копаться между двумя и пятью-шестью мс не охота. Мне в данном посте важно не время, за которое скрипт выполняет операцию поиска картинки, а разница во времени, между двумя скриптами. Я думал, что это будет очевидно...
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Я не жужжу - понять просто хочу...
« Reply #4 on: August 18, 2018, 01:55:14 PM »
Oraven, не совсем понимаю... Для чего одному потоку контролить какое-то событие и управлять вторым потоком, если проверку на это событие можно установить в основном теле скрипта и дальше действовать исходя из результата...?
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Я не жужжу - понять просто хочу...
« Reply #5 on: August 18, 2018, 02:06:38 PM »
KingDrakonov, я сейчас твой пост дочитал... Выбрось свой процессор   ;D
Я не ду... Потому и не бу...

KingDrakonov

  • Освоившийся
  • **
  • Posts: 39
    • View Profile
Re: Я не жужжу - понять просто хочу...
« Reply #6 on: August 18, 2018, 02:33:44 PM »
ты свой выбрось проц. мой справляется на ура оперативы маловато уже 6гиг,
сейчас мозал работает открыто 2 окна 54 вкладки, и куча дополнений стоит, и ты говоришь мой проц говно
я с этими скриптами уже неделю мучаюсь пишу для 2х игр одновременно и прочитал здесь кучу всего большинство пролистал

KingDrakonov

  • Освоившийся
  • **
  • Posts: 39
    • View Profile
Re: Я не жужжу - понять просто хочу...
« Reply #7 on: August 18, 2018, 02:50:44 PM »
а да мне самому было интересно сколько времени пройдет и записал

к с тате как все работало так работает не чего не выключал хотя освободить нагрузку на проц магу другим образом

Атеист

  • Guest
Re: Я не жужжу - понять просто хочу...
« Reply #8 on: August 18, 2018, 03:07:59 PM »
То есть время работы скрипта в три потока (в которых абсолютно равные условия) увеличилось ровно в три раза.

Очевидно, что при большем количестве потоков, комп начинает тормозить. Если исключить из времени теста этот зависон, то видно, что потоки работают правильно.
Нужно по другому организовать сам тест. У тебя после запуска двух потоков нет времени на их выполнение - сразу поиск картинки (нагрузка на проц) и остановка скрипта. Потоки с задержками 50ms просто не успевают отработать. Получается, что ты измеряешь не время работы трех функций IF_PICTURE_IN(), а по большей части время зависания системы.
Немного переделанный скрипт покажет время работы потоков точнее. Задержка в 500ms увеличивает общее время выполнения скрипта, но цель теста не в определении общего времени. Нам нужно узнать чистое время работы функций, а именно трех IF_PICTURE_IN() против одной.
Останавливаем отработавшие потоки - разгружаем проц. Иначе суммарный поиск картинки каждые 25ms, это тяжело (первый то твой скрипт работает без такой нагрузки, по этому и быстрее в 3 раза).

Code: (clickermann) [Select]
THREAD(name1, 0)
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 50)
     
   END_IF
   // WAITMS(50) // в этом тесте, задержка здесь не нужна
   SETTHREAD (name1, 0) // останавливаем отработавший поток - разгружаем процессор
END_THREAD

THREAD(name2, 0)
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 50)
     
   END_IF
   // WAITMS(50)
   SETTHREAD (name2, 0) // останавливаем поток
END_THREAD


GETSCREEN
COLORMODE(7)
$check_time=$_ms
SETTHREAD (name1, 1)
SETTHREAD (name2, 1)

WAITMS(500) // без задержки в этом месте, потоки не успевают найти картинки, но успевают вызвать зависон системы

IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 50)
   
END_IF

// WAITMS(500) // если перенести задержку сюда, то от зависания не избавиться и время увеличится

LOGWRITE ($_ms-$check_time-500) // вычитаем из общего времени время отдыха 500ms

// HALT

Да, еще забыл сказать, что для всех потоков буфер графического анализа общий, он единственный. Тоже надо учитывать иногда.
« Last Edit: August 18, 2018, 03:13:29 PM by Атеист »

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Я не жужжу - понять просто хочу...
« Reply #9 on: August 18, 2018, 03:12:49 PM »
к с тате как все работало так работает не чего не выключал хотя освободить нагрузку на проц магу другим образом

Мазила не только у тебя работает. Только у меня в ней вкладок чуток побольше... А тестировал я на виртуалке (у меня в ней игра просто работает), на которую выделено 2 ядра от всего процессора  :) Так что цифры времени поиска картинки, которые я привел в посте, получены в ОДНОЙ ИЗ запущенных виртуалок  :) И разрешение экрана у меня не многим меньше твоего - 1440x900.
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Я не жужжу - понять просто хочу...
« Reply #10 on: August 18, 2018, 03:15:30 PM »
Атеист, чую логику... Домой приеду - потестю...
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Я не жужжу - понять просто хочу...
« Reply #11 on: August 18, 2018, 06:00:29 PM »
Атеист, я скоро буду дома и вот, что я придумал... Ты говоришь, что идет напруга на процессор из-за отсутствия передышки (в моем варианте). Ок. Сделаем иначе... Запустим не три потока, а три кликера и в каждом абсолютно эденьтичное условие поиска. Вот три кликера точно будут, как три абсолютно независимых потока. И я больше чем уверен, что три кликера справятся с задачей намного быстрее, чем три потока. Функции поиска во всех трех кликерах будут запущенны практически одновременно. Разница будет если, то не более, чем в 10-20 мс.
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Я не жужжу - понять просто хочу...
« Reply #12 on: August 18, 2018, 06:49:01 PM »
Ну, вот как бы чего и требовалось доказать... Одно и то же условие запущено в трех кликерах одновременно. Трир кликера запускаются заранее и ждут в цикле команду на старт. Четвертым кликером мы даем им эту команду.

Скрипт в трех кликерах:
Code: (clickermann) [Select]
GETSCREEN
COLORMODE(7)

WHILE(INIREAD("variables.ini", "start", "timer") = 0)
   WAITMS(20)
END_CYC

$check_time=INIREAD("variables.ini", "start", "timer")

IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 50)

END_IF

LOGWRITE ($_ms-$check_time)

HALT
Во всех трех кликерах код абсолютно одинаковый.

Код в четвертом кликере:
Code: (clickermann) [Select]
INIWRITE("variables.ini", "start", $_ms, "timer")
HALT

И, как результат:


И, на сколько я понимаю (если я не прав, то пусть уважаемый Джони меня поправит), "потоки" в кликере реализованы, как таймеры? То есть - они по сути не являются полноценными, независимыми потоками, а динамически создаются в кликере, как таймеры? Просто поведение этих самых "потоков" очень на это похоже... Не знаю - где и как, но в delphi так ведут себя именно таймеры.
« Last Edit: August 18, 2018, 07:01:26 PM by Hito »
Я не ду... Потому и не бу...

Атеист

  • Guest
Re: Я не жужжу - понять просто хочу...
« Reply #13 on: August 18, 2018, 07:09:21 PM »
А моя версия твоего теста какое время показывает?

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Я не жужжу - понять просто хочу...
« Reply #14 on: August 18, 2018, 07:15:36 PM »
А моя версия твоего теста какое время показывает?
Извини - я даже не пробовал. Просто пока в автобусе возвращался, мне все это в голову пришло и я сразу намутил, как приехал. Просто как бы это все объясняет, что мощность и подвисание процессора тут ни при чем. Три кликера одновременно осуществляют один и тот же поиск и ничего не виснет и выполняется в три раза быстрее, чем три потока в одном кликере. Это говорит о том, что эти потоки все же просто ждут друг друга. А если это так, то я возвращаюсь к своему вопросу - для чего в кликере эти потоки...?
Я не ду... Потому и не бу...