Size: a a a

2020 March 12

LO

Lucky Ook in pro.lua
Попробовал запихнуть крутилку пикселей в корутину. Профита не заметил. Может я неправильно как-то это делаю?
источник

S

Snusmumriken in pro.lua
Профита производительности?
источник

AO

Alexander Orlow in pro.lua
Карма это магический катализатор, который позволяем использовать заклинание “ТЫЖПРОГРАММИСТ“
источник

LO

Lucky Ook in pro.lua
Snusmumriken
Профита производительности?
Ага.
источник

S

Snusmumriken in pro.lua
Ну дык корутины несут производительность в том случае, если ты пользуешься неблокирующими операциями, которые обычно блокируют.
источник

LO

Lucky Ook in pro.lua
Snusmumriken
Ну дык корутины несут производительность в том случае, если ты пользуешься неблокирующими операциями, которые обычно блокируют.
Например?
источник

S

Snusmumriken in pro.lua
Допустим ты такой качаешь файлы сокетами:
local files = {url1, url2}

for i, v in ipairs(files) do
 files[i] = http.request(v)
end

Вот тут мы такие последовательно скачиваем файлы без корутин.
источник

S

Snusmumriken in pro.lua
И это медленно, потому что 90% затраченного времени — ожидание ответа от другой стороны соединения. Мы могли бы начать скачивать сразу все файлы, открыв на каждое по неблокирующему соединению, запихнув в корутину.
источник

S

Snusmumriken in pro.lua
Ещё можно было бы с помощью корутины разбить твою крутилку пикселей на несколько коротких этапов, и разбить выполнение функции на несколько кадров, не блокируя ввод. Типа:
1. Сделали кусочек работы
2. Обработали ввод
3. Нарисовали гуй
4. goto 1

Чтобы на длинных операциях не блокировать гуй, сохранив отзывчивость, и визуально повысив производительность (убрав пролаги интерфейсов на длинных операциях).
источник

S

Snusmumriken in pro.lua
Так-то корутины не выполняются параллельно, для параллельности нужна многопроцессорность (тру многопоточка).
источник

LO

Lucky Ook in pro.lua
Погодь, кажется, начинаю понимать - разделить картинку на части и просчитывать каждую часть в отдельной корутине?
источник

LO

Lucky Ook in pro.lua
И. пожалуй, с разным разрешением, тоже можно.
источник

S

Snusmumriken in pro.lua
Не, разделить длинную операцию на несколько.
Ну там:

function factorial(value)
 local n = 1
 for i = 2, value do
   n = n * i
   if i % 1000 then coroutine.yield() end
 end
 return n
end

А потом, если тебе надо посчитать очень большие факториалы которые долго считаются — ты несколько раз вызываешь корутину с этой функцией каждый кадр, пока не получишь результат. Чтобы интерфейсы не лагали.

В твоей крутилке пикселей — обернуть в корутину функцию обработки нескольких тысяч пикселей, и  вызывать её каждый кадр, пока не обработается.
источник

LO

Lucky Ook in pro.lua
Только я пока не соображу, как в коде это описать - новая концепция просто так не укладывается в ум.
источник

LO

Lucky Ook in pro.lua
А ещё такой вопрос - как повторно запустить корутину?
источник

S

Snusmumriken in pro.lua
А для производительности — возьми, например, lua lanes, и шли сообщеньки между потоками:
— Эй, дочерний поток, тут есть картинка которую надо обработать.
— Окс.
— Ну что там, уже готово?
— Не, считаю пока.
— А теперь?
— Ага, во, держи обработанную картинку.
источник

LO

Lucky Ook in pro.lua
Вот она досчитала до конца картинку и мне надо дёрнуть её ещё раз с другими данными.
источник

S

Snusmumriken in pro.lua
Создавай новую корутину или сделай внутри корутины бесконечный цикл.
источник

LO

Lucky Ook in pro.lua
Snusmumriken
А для производительности — возьми, например, lua lanes, и шли сообщеньки между потоками:
— Эй, дочерний поток, тут есть картинка которую надо обработать.
— Окс.
— Ну что там, уже готово?
— Не, считаю пока.
— А теперь?
— Ага, во, держи обработанную картинку.
lua lanes - это стандартная библиотека?
источник

S

Snusmumriken in pro.lua
Нет конечно ))
источник