LINUX.ORG.RU

История изменений

Исправление 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+ проходов вторая функция сравнима с первой по скорости или чуууть чуть медленнее.. То есть вторая замедляется при увеличении количества проходов. Что то там накапливается. Но это не смертельно, мне такое количество за раз и не нужно - у меня малое число проходов единовременно.

Получается не надо было выпендриваться.. Или же есть вариант оптимизации второй? Хмм.. Надо еще подумать.