История изменений
Исправление LightDiver, (текущая версия) :
Смотри, кажись я перехитрил сам себя:
function time100_Server(channel, text, sender, prefix)
if prefix == "time100" then
-- Получаем полные строки данных
local objFull = mFldS:getStaticStr(sender, 1)
local hpFull = mFldS:getStaticStr(sender, 2)
-- Преобразуем строки в таблицы для удобной модификации
local objTable = {}
local hpTable = {}
-- Заполняем таблицы объектов и значений (разбиваем на группы по 3 символа)
for i = 1, math.max(#objFull, #hpFull), 3 do
objTable[#objTable+1] = objFull:sub(i, i+2)
hpTable[#hpTable+1] = hpFull:sub(i, i+2)
end
-- Основной цикл обработки объектов
for idx = 1, #objTable do
local obj = objTable[idx]
local hp = hpTable[idx]:gsub("%s+", "") -- Убираем пробелы перед декодированием
if obj == "00t" then
-- Обработка активного объекта
local decoded = en10(hp)
if decoded < 999 then
-- Увеличиваем значение на 1, если оно меньше 999
hpTable[idx] = string.sub(" "..en85(decoded + 1), -3)
else
-- Если значение 999 или больше, увеличиваем с шансом 10%
local x = math.random(1, 10)
if x == 10 then
hpTable[idx] = string.sub(" "..en85(decoded + 1), -3)
end
end
elseif obj == "00f" then
-- Обработка неактивного объекта
local decoded = en10(hp)
if decoded < 999 then
-- Увеличиваем значение на 1, если оно меньше 999
hpTable[idx] = string.sub(" "..en85(decoded + 1), -3)
else
-- Заменяем тип объекта при достижении максимума
objTable[idx] = "00t"
end
end
end
-- Собираем результаты обратно в строки
local newObjStr = table.concat(objTable)
local newHpStr = table.concat(hpTable)
-- Записываем обновленные данные
mFldS:addStaticStr(sender, 1, nil, newObjStr)
mFldS:addStaticStr(sender, 2, nil, newHpStr)
end
end
function time100_Server1(channel, text, sender, prefix)
if prefix == "time100" then
for i = 1, 100 do
if mFldS:getStaticStr(sender, 1, i) == "00t" then
if en10(mFldS:getStaticStr(sender, 2, i)) < 999 then
mFldS:addStaticStr(sender, 2, i, string.sub(" "..en85(en10(mFldS:getStaticStr(sender, 2, i)) + 1), -3))
else
local x = math.random(1, 10)
if x == 10 then
mFldS:addStaticStr(sender, 2, i, string.sub(" "..en85(en10(mFldS:getStaticStr(sender, 2, i)) + 1), -3))
end
end
end
if mFldS:getStaticStr(sender, 1, i) == "00f" then
if en10(mFldS:getStaticStr(sender, 2, i)) < 999 then
mFldS:addStaticStr(sender, 2, i, string.sub(" "..en85(en10(mFldS:getStaticStr(sender, 2, i)) + 1), -3))
else
mFldS:addStaticStr(sender, 1, i, "00t")
end
end
end
end
end
Я сделал две функции. Первую типа оптимально. Распаковал, обработал, запаковал. Вторую сделал без выпендрежа тупо через свои методы. Прочитал конкретное значение в строке, сравнил, записал. Напрмую. Так вот. Вторая функция при 1000 проходов жрет вдвое меньше памяти, чем первая, это раз. Во-вторых, в 8 раз меньше, чем мои прошлые варианты. 2мб озу при 1000 проходов вместо 16мб.
А вот со скоростью забавное. При малых значениях от 1 до 500 проходов за раз, вторая функция ВДВОЕ быстрее первой. Вот это поворот, а? При 5000+ проходов вторая функция сравнима с первой по скорости или чуууть чуть медленнее.. То есть вторая замедляется при увеличении количества проходов. Что то там накапливается. Но это не смертельно, мне такое количество за раз и не нужно - у меня малое число проходов единовременно.
Получается не надо было выпендриваться.. Или же есть вариант оптимизации второй? Хмм.. Надо еще подумать.
Оказывается, мои методы сами по себе весьма оптимальны и не требуют оптимизации, вот так вот.
Исправление LightDiver, :
Смотри, кажись я перехитрил сам себя:
function time100_Server(channel, text, sender, prefix)
if prefix == "time100" then
-- Получаем полные строки данных
local objFull = mFldS:getStaticStr(sender, 1)
local hpFull = mFldS:getStaticStr(sender, 2)
-- Преобразуем строки в таблицы для удобной модификации
local objTable = {}
local hpTable = {}
-- Заполняем таблицы объектов и значений (разбиваем на группы по 3 символа)
for i = 1, math.max(#objFull, #hpFull), 3 do
objTable[#objTable+1] = objFull:sub(i, i+2)
hpTable[#hpTable+1] = hpFull:sub(i, i+2)
end
-- Основной цикл обработки объектов
for idx = 1, #objTable do
local obj = objTable[idx]
local hp = hpTable[idx]:gsub("%s+", "") -- Убираем пробелы перед декодированием
if obj == "00t" then
-- Обработка активного объекта
local decoded = en10(hp)
if decoded < 999 then
-- Увеличиваем значение на 1, если оно меньше 999
hpTable[idx] = string.sub(" "..en85(decoded + 1), -3)
else
-- Если значение 999 или больше, увеличиваем с шансом 10%
local x = math.random(1, 10)
if x == 10 then
hpTable[idx] = string.sub(" "..en85(decoded + 1), -3)
end
end
elseif obj == "00f" then
-- Обработка неактивного объекта
local decoded = en10(hp)
if decoded < 999 then
-- Увеличиваем значение на 1, если оно меньше 999
hpTable[idx] = string.sub(" "..en85(decoded + 1), -3)
else
-- Заменяем тип объекта при достижении максимума
objTable[idx] = "00t"
end
end
end
-- Собираем результаты обратно в строки
local newObjStr = table.concat(objTable)
local newHpStr = table.concat(hpTable)
-- Записываем обновленные данные
mFldS:addStaticStr(sender, 1, nil, newObjStr)
mFldS:addStaticStr(sender, 2, nil, newHpStr)
end
end
function time100_Server1(channel, text, sender, prefix)
if prefix == "time100" then
-- Функция для увеличения значения
local function incrementValue(sender, i)
local value = en10(mFldS:getStaticStr(sender, 2, i))
return string.sub(" "..en85(value + 1), -3)
end
-- Основной цикл
for i = 1, 100 do
local objType = mFldS:getStaticStr(sender, 1, i)
local value = en10(mFldS:getStaticStr(sender, 2, i))
if objType == "00t" then
if value < 999 then
mFldS:addStaticStr(sender, 2, i, incrementValue(sender, i))
else
local x = math.random(1, 10)
if x == 10 then
mFldS:addStaticStr(sender, 2, i, incrementValue(sender, i))
end
end
elseif objType == "00f" then
if value < 999 then
mFldS:addStaticStr(sender, 2, i, incrementValue(sender, i))
else
mFldS:addStaticStr(sender, 1, i, "00t")
end
end
end
end
end
Я сделал две функции. Первую типа оптимально. Распаковал, обработал, запаковал. Вторую сделал без выпендрежа тупо через свои методы. Прочитал конкретное значение в строке, сравнил, записал. Напрмую. Так вот. Вторая функция при 1000 проходов жрет вдвое меньше памяти, чем первая, это раз. Во-вторых, в 8 раз меньше, чем мои прошлые варианты. 2мб озу при 1000 проходов вместо 16мб.
А вот со скоростью забавное. При малых значениях от 1 до 500 проходов за раз, вторая функция ВДВОЕ быстрее первой. Вот это поворот, а? При 5000+ проходов вторая функция сравнима с первой по скорости или чуууть чуть медленнее.. То есть вторая замедляется при увеличении количества проходов. Что то там накапливается. Но это не смертельно, мне такое количество за раз и не нужно - у меня малое число проходов единовременно.
Получается не надо было выпендриваться.. Или же есть вариант оптимизации второй? Хмм.. Надо еще подумать.
Оказывается, мои методы сами по себе весьма оптимальны и не требуют оптимизации, вот так вот.
Исправление LightDiver, :
Смотри, кажись я перехитрил сам себя:
function time100_Server(channel, text, sender, prefix)
if prefix == "time100" then
-- Получаем полные строки данных
local objFull = mFldS:getStaticStr(sender, 1)
local hpFull = mFldS:getStaticStr(sender, 2)
-- Преобразуем строки в таблицы для удобной модификации
local objTable = {}
local hpTable = {}
-- Заполняем таблицы объектов и значений (разбиваем на группы по 3 символа)
for i = 1, math.max(#objFull, #hpFull), 3 do
objTable[#objTable+1] = objFull:sub(i, i+2)
hpTable[#hpTable+1] = hpFull:sub(i, i+2)
end
-- Основной цикл обработки объектов
for idx = 1, #objTable do
local obj = objTable[idx]
local hp = hpTable[idx]:gsub("%s+", "") -- Убираем пробелы перед декодированием
if obj == "00t" then
-- Обработка активного объекта
local decoded = en10(hp)
if decoded < 999 then
-- Увеличиваем значение на 1, если оно меньше 999
hpTable[idx] = string.sub(" "..en85(decoded + 1), -3)
else
-- Если значение 999 или больше, увеличиваем с шансом 10%
local x = math.random(1, 10)
if x == 10 then
hpTable[idx] = string.sub(" "..en85(decoded + 1), -3)
end
end
elseif obj == "00f" then
-- Обработка неактивного объекта
local decoded = en10(hp)
if decoded < 999 then
-- Увеличиваем значение на 1, если оно меньше 999
hpTable[idx] = string.sub(" "..en85(decoded + 1), -3)
else
-- Заменяем тип объекта при достижении максимума
objTable[idx] = "00t"
end
end
end
-- Собираем результаты обратно в строки
local newObjStr = table.concat(objTable)
local newHpStr = table.concat(hpTable)
-- Записываем обновленные данные
mFldS:addStaticStr(sender, 1, nil, newObjStr)
mFldS:addStaticStr(sender, 2, nil, newHpStr)
end
end
function time100_Server1(channel, text, sender, prefix)
if prefix == "time100" then
for i = 1, 100 do
if mFldS:getStaticStr(sender, 1, i) == "00t" then
if en10(mFldS:getStaticStr(sender, 2, i)) < 999 then
mFldS:addStaticStr(sender, 2, i, string.sub(" "..en85(en10(mFldS:getStaticStr(sender, 2, i)) + 1), -3))
else
local x = math.random(1, 10)
if x == 10 then
mFldS:addStaticStr(sender, 2, i, string.sub(" "..en85(en10(mFldS:getStaticStr(sender, 2, i)) + 1), -3))
end
end
end
if mFldS:getStaticStr(sender, 1, i) == "00f" then
if en10(mFldS:getStaticStr(sender, 2, i)) < 999 then
mFldS:addStaticStr(sender, 2, i, string.sub(" "..en85(en10(mFldS:getStaticStr(sender, 2, i)) + 1), -3))
else
mFldS:addStaticStr(sender, 1, i, "00t")
end
end
end
end
end
Я сделал две функции. Первую типа оптимально. Распаковал, обработал, запаковал. Вторую сделал без выпендрежа тупо через свои методы. Прочитал конкретное значение в строке, сравнил, записал. Напрмую. Так вот. Вторая функция при 1000 проходов жрет вдвое меньше памяти, чем первая, это раз. Во-вторых, в 8 раз меньше, чем мои прошлые варианты. 2мб озу при 1000 проходов вместо 16мб.
А вот со скоростью забавное. При малых значениях от 1 до 500 проходов за раз, вторая функция ВДВОЕ быстрее первой. Вот это поворот, а? При 5000+ проходов вторая функция сравнима с первой по скорости или чуууть чуть медленнее.. То есть вторая замедляется при увеличении количества проходов. Что то там накапливается. Но это не смертельно, мне такое количество за раз и не нужно - у меня малое число проходов единовременно.
Получается не надо было выпендриваться.. Или же есть вариант оптимизации второй? Хмм.. Надо еще подумать.
Оказывается, мои методы сами по себе весьма оптимальны и не требуют оптимизации, вот так вот.
Исправление LightDiver, :
Смотри, кажись я перехитрил сам себя:
function time100_Server(channel, text, sender, prefix)
if prefix == "time100" then
-- Получаем полные строки данных
local objFull = mFldS:getStaticStr(sender, 1)
local hpFull = mFldS:getStaticStr(sender, 2)
-- Преобразуем строки в таблицы для удобной модификации
local objTable = {}
local hpTable = {}
-- Заполняем таблицы объектов и значений (разбиваем на группы по 3 символа)
for i = 1, math.max(#objFull, #hpFull), 3 do
objTable[#objTable+1] = objFull:sub(i, i+2)
hpTable[#hpTable+1] = hpFull:sub(i, i+2)
end
-- Основной цикл обработки объектов
for idx = 1, #objTable do
local obj = objTable[idx]
local hp = hpTable[idx]:gsub("%s+", "") -- Убираем пробелы перед декодированием
if obj == "00t" then
-- Обработка активного объекта
local decoded = en10(hp)
if decoded < 999 then
-- Увеличиваем значение на 1, если оно меньше 999
hpTable[idx] = string.sub(" "..en85(decoded + 1), -3)
else
-- Если значение 999 или больше, увеличиваем с шансом 10%
local x = math.random(1, 10)
if x == 10 then
hpTable[idx] = string.sub(" "..en85(decoded + 1), -3)
end
end
elseif obj == "00f" then
-- Обработка неактивного объекта
local decoded = en10(hp)
if decoded < 999 then
-- Увеличиваем значение на 1, если оно меньше 999
hpTable[idx] = string.sub(" "..en85(decoded + 1), -3)
else
-- Заменяем тип объекта при достижении максимума
objTable[idx] = "00t"
end
end
end
-- Собираем результаты обратно в строки
local newObjStr = table.concat(objTable)
local newHpStr = table.concat(hpTable)
-- Записываем обновленные данные
mFldS:addStaticStr(sender, 1, nil, newObjStr)
mFldS:addStaticStr(sender, 2, nil, newHpStr)
end
end
function time100_Server1(channel, text, sender, prefix)
if prefix == "time100" then
for i = 1, 100 do
if mFldS:getStaticStr(sender, 1, i) == "00t" then
if en10(mFldS:getStaticStr(sender, 2, i)) < 999 then
mFldS:addStaticStr(sender, 2, i, string.sub(" "..en85(en10(mFldS:getStaticStr(sender, 2, i)) + 1), -3))
else
local x = math.random(1, 10)
if x == 10 then
mFldS:addStaticStr(sender, 2, i, string.sub(" "..en85(en10(mFldS:getStaticStr(sender, 2, i)) + 1), -3))
end
end
end
if mFldS:getStaticStr(sender, 1, i) == "00f" then
if en10(mFldS:getStaticStr(sender, 2, i)) < 999 then
mFldS:addStaticStr(sender, 2, i, string.sub(" "..en85(en10(mFldS:getStaticStr(sender, 2, i)) + 1), -3))
else
mFldS:addStaticStr(sender, 1, i, "00t")
end
end
end
end
end
Я сделал две функции. Первую типа оптимально. Распаковал, обработал, запаковал. Вторую сделал без выпендрежа тупо через свои методы. Прочитал, сравнил, записал. Напрмую. Так вот. Вторая функция при 1000 проходов жрет вдвое меньше памяти, чем первая, это раз. Во-вторых, в 8 раз меньше, чем мои прошлые варианты. 2мб озу при 1000 проходов вместо 16мб.
А вот со скоростью забавное. При малых значениях от 1 до 500 проходов за раз, вторая функция ВДВОЕ быстрее первой. Вот это поворот, а? При 5000+ проходов вторая функция сравнима с первой по скорости или чуууть чуть медленнее.. То есть вторая замедляется при увеличении количества проходов. Что то там накапливается. Но это не смертельно, мне такое количество за раз и не нужно - у меня малое число проходов единовременно.
Получается не надо было выпендриваться.. Или же есть вариант оптимизации второй? Хмм.. Надо еще подумать.
Оказывается, мои методы сами по себе весьма оптимальны и не требуют оптимизации, вот так вот.
Исправление LightDiver, :
Смотри, кажись я перехитрил сам себя:
function time100_Server(channel, text, sender, prefix)
if prefix == "time100" then
-- Получаем полные строки данных
local objFull = mFldS:getStaticStr(sender, 1)
local hpFull = mFldS:getStaticStr(sender, 2)
-- Преобразуем строки в таблицы для удобной модификации
local objTable = {}
local hpTable = {}
-- Заполняем таблицы объектов и значений (разбиваем на группы по 3 символа)
for i = 1, math.max(#objFull, #hpFull), 3 do
objTable[#objTable+1] = objFull:sub(i, i+2)
hpTable[#hpTable+1] = hpFull:sub(i, i+2)
end
-- Основной цикл обработки объектов
for idx = 1, #objTable do
local obj = objTable[idx]
local hp = hpTable[idx]:gsub("%s+", "") -- Убираем пробелы перед декодированием
if obj == "00t" then
-- Обработка активного объекта
local decoded = en10(hp)
if decoded < 999 then
-- Увеличиваем значение на 1, если оно меньше 999
hpTable[idx] = string.sub(" "..en85(decoded + 1), -3)
else
-- Если значение 999 или больше, увеличиваем с шансом 10%
local x = math.random(1, 10)
if x == 10 then
hpTable[idx] = string.sub(" "..en85(decoded + 1), -3)
end
end
elseif obj == "00f" then
-- Обработка неактивного объекта
local decoded = en10(hp)
if decoded < 999 then
-- Увеличиваем значение на 1, если оно меньше 999
hpTable[idx] = string.sub(" "..en85(decoded + 1), -3)
else
-- Заменяем тип объекта при достижении максимума
objTable[idx] = "00t"
end
end
end
-- Собираем результаты обратно в строки
local newObjStr = table.concat(objTable)
local newHpStr = table.concat(hpTable)
-- Записываем обновленные данные
mFldS:addStaticStr(sender, 1, nil, newObjStr)
mFldS:addStaticStr(sender, 2, nil, newHpStr)
end
end
function time100_Server1(channel, text, sender, prefix)
if prefix == "time100" then
for i = 1, 100 do
if mFldS:getStaticStr(sender, 1, i) == "00t" then
if en10(mFldS:getStaticStr(sender, 2, i)) < 999 then
mFldS:addStaticStr(sender, 2, i, string.sub(" "..en85(en10(mFldS:getStaticStr(sender, 2, i)) + 1), -3))
else
local x = math.random(1, 10)
if x == 10 then
mFldS:addStaticStr(sender, 2, i, string.sub(" "..en85(en10(mFldS:getStaticStr(sender, 2, i)) + 1), -3))
end
end
end
if mFldS:getStaticStr(sender, 1, i) == "00f" then
if en10(mFldS:getStaticStr(sender, 2, i)) < 999 then
mFldS:addStaticStr(sender, 2, i, string.sub(" "..en85(en10(mFldS:getStaticStr(sender, 2, i)) + 1), -3))
else
mFldS:addStaticStr(sender, 1, i, "00t")
end
end
end
end
end
Я сделал две функции. Первую типа оптимально. Распаковал, обработал, запаковал. Вторую сделал без выпендрежа тупо через свои методы. Прочитал, сравнил, записал. Напрмую. Так вот. Вторая функция при 1000 проходов жрет вдвое меньше памяти, чем первая, это раз. Во-вторых, в 8 раз меньше, чем мои прошлые варианты. 2мб озу при 1000 проходов вместо 16мб.
А вот со скоростью забавное. При малых значениях от 1 до 500 проходов за раз, вторая функция ВДВОЕ быстрее первой. Вот это поворот, а? При 5000+ проходов вторая функция сравнима с первой по скорости или чуууть чуть медленнее.. То есть вторая замедляется при увеличении количества проходов. Что то там накапливается. Но это не смертельно, мне такое количество за раз и не нужно - у меня малое число проходов единовременно.
Получается не надо было выпендриваться.. Или же есть вариант оптимизации второй? Хмм.. Надо еще подумать.
Исходная версия LightDiver, :
Смотри, кажись я перехитрил сам себя:
function time100_Server(channel, text, sender, prefix)
if prefix == "time100" then
-- Получаем полные строки данных
local objFull = mFldS:getStaticStr(sender, 1)
local hpFull = mFldS:getStaticStr(sender, 2)
-- Преобразуем строки в таблицы для удобной модификации
local objTable = {}
local hpTable = {}
-- Заполняем таблицы объектов и значений (разбиваем на группы по 3 символа)
for i = 1, math.max(#objFull, #hpFull), 3 do
objTable[#objTable+1] = objFull:sub(i, i+2)
hpTable[#hpTable+1] = hpFull:sub(i, i+2)
end
-- Основной цикл обработки объектов
for idx = 1, #objTable do
local obj = objTable[idx]
local hp = hpTable[idx]:gsub("%s+", "") -- Убираем пробелы перед декодированием
if obj == "00t" then
-- Обработка активного объекта
local decoded = en10(hp)
if decoded < 999 then
-- Увеличиваем значение на 1, если оно меньше 999
hpTable[idx] = string.sub(" "..en85(decoded + 1), -3)
else
-- Если значение 999 или больше, увеличиваем с шансом 10%
local x = math.random(1, 10)
if x == 10 then
hpTable[idx] = string.sub(" "..en85(decoded + 1), -3)
end
end
elseif obj == "00f" then
-- Обработка неактивного объекта
local decoded = en10(hp)
if decoded < 999 then
-- Увеличиваем значение на 1, если оно меньше 999
hpTable[idx] = string.sub(" "..en85(decoded + 1), -3)
else
-- Заменяем тип объекта при достижении максимума
objTable[idx] = "00t"
end
end
end
-- Собираем результаты обратно в строки
local newObjStr = table.concat(objTable)
local newHpStr = table.concat(hpTable)
-- Записываем обновленные данные
mFldS:addStaticStr(sender, 1, nil, newObjStr)
mFldS:addStaticStr(sender, 2, nil, newHpStr)
end
end
function time100_Server1(channel, text, sender, prefix)
if prefix == "time100" then
for i = 1, 100 do
if mFldS:getStaticStr(sender, 1, i) == "00t" then
if en10(mFldS:getStaticStr(sender, 2, i)) < 999 then
mFldS:addStaticStr(sender, 2, i, string.sub(" "..en85(en10(mFldS:getStaticStr(sender, 2, i)) + 1), -3))
else
local x = math.random(1, 10)
if x == 10 then
mFldS:addStaticStr(sender, 2, i, string.sub(" "..en85(en10(mFldS:getStaticStr(sender, 2, i)) + 1), -3))
end
end
end
if mFldS:getStaticStr(sender, 1, i) == "00f" then
if en10(mFldS:getStaticStr(sender, 2, i)) < 999 then
mFldS:addStaticStr(sender, 2, i, string.sub(" "..en85(en10(mFldS:getStaticStr(sender, 2, i)) + 1), -3))
else
mFldS:addStaticStr(sender, 1, i, "00t")
end
end
end
end
end
Я сделал вде функции. Первую типа оптимально. Распаковал, обработал, запаковал. Вторую сделал без выпендрежа тупо через свои методы. Прочитал, сравнил, записал. Напрмую. Так вот. Вторая функция при 1000 проходов жрет вдвое меньше памяти, чем первая, это раз. Во-вторых, в 8 раз меньше, чем мои прошлые варианты. 2мб озу при 1000 проходов вместо 16мб.
А вот со скоростью забавное. При малых значениях от 1 до 500 проходов за раз, вторая функция ВДВОЕ быстрее первой. Вот это поворот, а? При 5000+ проходов вторая функция сравнима с первой по скорости или чуууть чуть медленнее.. То есть вторая замедляется при увеличении количества проходов. Что то там накапливается. Но это не смертельно, мне такое количество за раз и не нужно - у меня малое число проходов единовременно.
Получается не надо было выпендриваться.. Или же есть вариант оптимизации второй? Хмм.. Надо еще подумать.