Snusmumriken
Snusmumriken
объясните пожалуйста поведение... есть код: function miniMaxSum(arr)
function sum(arg, ...)
local total = arg
local addarg = {...}
for _,v in pairs(addarg) do total = total + v end
return total
end
table.sort(arr)
print(string.format("%d %d", sum(table.unpack(arr,1,#arr-1)), sum(table.unpack(arr,2,#arr))))
return
end
В целом, эту функцию стоит написать вот так:
function miniMaxSum(arr)
local min, max, summ = math.huge, -math.huge, 0
-- for в ~1.5-2 раза быстрее pairs/ipairs
for i = 1, #arr do
local v = arr[i]
if v < min then min = v end
if v > max then max = v end
summ = summ + v
end
return summ - max, summ - min
end
print(miniMaxSum{1, 2, 3, 4, 5})
Не создаются ни функции ни таблицы, нет шансов переполнения стека, ничего не сортируется и вообще, минимум лишних движений, и сложность всегда равна O(n) а не O(n log(n) + 2n) в среднем.
Dmitriy
спасибо за совет, учту. вопрос правда был в поведении busted.
Snusmumriken
Ничего не передалось в sum(arg, ...), и total стал nil.
Dmitriy
я как начинающий не понимаю, почему «не передалось» — тест по идее должен запускать функцию с переданными параметрами?
Dmitriy
а задано запустить конкретную функцию с конкретным параметром, разве нет?
Snusmumriken
Запускаешь и тестишь в одной и той же среде?
Dmitriy
Тест запускается в консоли командой busted, текст теста я привёл. Насколько я понимаю, задача сравнить на равенство строку и результат вызова функции с параметром. Какого лешего busted начал вызывать вложенную функцию?
Dmitriy
я уже починил всё, написав рекурсивную функцию сложения с переменными аргументами, на которую не ругается, но всё равно не ясно в чём ошибка...
Snusmumriken
Во, совсем забыл. Ты ещё объявляешь функцию sum глобально, и каждый раз при вызове минимакса.
Snusmumriken
А зачем оно тебе именно в таком виде? Прогони мой вариант в бустеде, скажи что ответит ))
Snusmumriken
П.С. Надеюсь это не пойдёт в прод.
Dmitriy
бгг. я второй день играюсь с Lua, какой прод
Snusmumriken
Ну и хорошо, а то я за такое в проде бью по рукам. Но пока баловство — норм и даже хорошо.
Snusmumriken
Если выводить мин-максы четырёх значений из пяти, то опять таки, зачем unpack и прочие рекурсии? Указываешь цифрами диапазон цикла через for i = _start, _end do. Переменные аргументы это весело, но как правило не нужно.
Snusmumriken
Где переменные аргументы прям рулят, так это в логировании и в колбеках:
function log(level, msg, ...)
if ... then msg = msg:format(...) end
print(level .. ' ' .. msg)
end
function callSomething(func, ...)
local res = {xpcall(func, debug.traceback, ...)}
if res[1] then
return (table.unpack or unpack)(res, 2)
end
return nil, res[2]
end
Dmitriy
мне показалось интереснее сделать общее решение, передавать в сумматор нужный диапазон, потому что слайсов, как я понимаю, нет
Snusmumriken
Общее решение ломается об реальность в виде лимита аргументов в функциях. Как только в табличке окажется 5-10к значений — всё умрёт, причём незаметно.
Dmitriy
good point
Snusmumriken
В моём примере callSomething, гарантированно можно использовать unpack потому, что это распаковка результатов возвращённых функцией. То есть, тут по умолчанию все лимиты соблюдены. Функция просто не вернёт больше аргументов, чем зашито в луа.
Dmitriy
спасибо, было полезно
Snusmumriken
Ну и не забудь добавить local перез function sum, тогда оно не засрёт глобалспейс. Если ты сделал её рекурсивной, то
local sum
function sum(...) return sum(select(2, ...)) end
С рекурсивными локальными функциями приходится объявлять их имя заранее: код локальной функции генерируется перед присвоением переменной.
Ещё луа не оптимизирует хвостовую рекурсию, поэтому можно получить огромный колл-стек и его переполнение.
Snusmumriken
К чему это я.
Дедушкины способы работают. Затейливые самовыражения, в подавляющем числе случаев, не нужны.
Dmitriy
а local function sum (x, ...) и local sum
function sum (x, ...) различаются по поведению?
Snusmumriken
Не а
Snusmumriken
Но во втором случае, эта функция получает возможность вызывать сама себя.
Dmitriy
в первом варианте тоже.
Snusmumriken
Нет.
Dmitriy
ну если оно сейчас у меня работает...
Dmitriy
а, понял, это сахар, прочитал у Иерусалимского
Snusmumriken
Оно работает, но не на всех версиях, помнится.
Dmitriy
When Lua expands its syntactic sugar for local functions, it does not use the naive definition. Instead, a definition like local function foo (params) body end expands to local foo; foo = function (params) body end
Igor
Извините, конечно, за оффтоп, но недавно мы тут поднимали тему о прожорливости веба и в свете релиза обновлённого "суперкрутого" раздела "Библиотека" в стиме, я просто не могу промолчать и не показать это чудо здеся.
http://igvx.ru/2019-11-01_18-02-51.mp4
Igor
Igor
Тележка ссылку парсить с видео чёт не захотела, ну ладно
Snusmumriken
Есть такое дело ))
Snusmumriken
Причём на графиках заметно, что сначала размечает дикое количество памяти, а потом подчищает. Мб заготовки под новости-скриншоты-комментарии, а потом обнаруживает что их ноль, и чистит.
Igor
Вот он, веб 21го века - проскроллил пару пикселей и тем самым спровоцировал страницу на резервирование лишних пятиста мегов....
Snusmumriken
Ну тут, кстати, гипотетически может быть ок. Ты ведь знаешь как работает рендер странички?
Snusmumriken
Snusmumriken
Типа, на самом деле страничка рисует немножко больше чем видно на экране, чтобы в случае если ты решил куда-то промотать — оно уже было нарисовано. Да и с каким-то динамическим контентом, надо перерисовывать только те тайлики, в которых что-то происходило.
Snusmumriken
И тайлики — динамическая штука, их есть некоторое изменяющееся количество: ты быстро промотал страницу и разметилась кучка новых. Задержался на какое-то время — часть старых снеслась.
Snusmumriken
На практике, пользователи гораздо чаще мотают вниз, поэтому эффективнее прогружать тайлы в совершенно конкретном направлении.
Igor
Сейчас полистал вопросы по новому интерфейсу стима, кто-то вообще жалуется, что если в нём посидеть долго и попереходить туда-сюда, то процесс вебхелпера отожрёт больше гига и не высвободит...
Snusmumriken
Snusmumriken
Bloatware во всей красе.
Igor
В начале своей работы процесс берёт ~170 метров, при скролле пиково доходит до ~900 метров и к тем 170 уже он больше не вернётся до перезапуска процесса, максимум до 500 упадёт
Igor
Я бы не сказал, что это проблема вебрендера, тут уже больше похоже на криворукость веберов Valve
Snusmumriken
Ды, благо стим уже давно превратился в браузер. Только раньше браузер был встроен частями (магазин, сообщество, друганы), а теперь и в библиотеку.
Igor
Ну раздел друзей тоже только недавно в веб перелопатили
Igor
Относительно недавно
Igor
Надеюсь у них хоть в планах есть эту досадную "мелочь" исправить
Andrey
конечно нет
Snusmumriken
Геймеры просто купят пеки помощнее. У меня уже 32гб оперативки, потому что я хотел запускать что-то одновременно с гуглхромом, а 8гб которые были у меня, он сжирал подчистую.
Andrey
^
Igor
Ну мне пока в принципе и 16 хватает
Igor
Под все мои задачи
Snusmumriken
Ну я прост пару месяцев назад обновлялся, и хотел запасец.
Igor
А вот если будет не хватать, то будет довольно хреново
Igor
В таком случае мне придётся и мамку менять
Igor
У неё 16гб максимум
Snusmumriken
Угу, а с ней и проц небось.
Igor
Ну да, проц тоже по хорошему менять стоит, если и материнку менять
Snusmumriken
Вот и обновились ))
Igor
FX-8300 уже не такой уж и новый
Snusmumriken
Кстати ттх вроде неплохие, один из первых восьмиядров?
Igor
вроде того, но у него не полноценные 8 ядер
Snusmumriken
Снижает частоты на каждом при высокой нагрузке, чтобы уместиться в энерговыделение?
Igor
недавно из-за этого отсудили владельцы таких же процессоров у AMD немалую сумму
Igor
Snusmumriken
А, 4/8 ядра.
Igor
На деле ядер 8, но у них общих блоков дофига, которые по идее должны быть для каждого ядра отдельными
Igor
Тем не менее AMD заявляли, что у них настоящие первые восьмиядерники
Snusmumriken
Бульдозеров можно вспомнить. А, это они и есть.
Igor
Я этот проц брал только из-за того, что он мощнее моего предыдущего, который уже явно надо было чем-то заменить и был он на том
Igor
Ну ещё у них сокет одинаковый был
Igor
Если бы было желание менять мамку я бы купил другой проц
Snusmumriken
Это амд, тут сокет почти не важен, обратные совместимости почти везде.
Igor
Довольно сложно найти сейчас в продаже AM3+ процы