Sam
Хех.
Ivan
не могу не вспомнить чудесный xkcd про floating point =)
Ivan
Highly Likely
:-)))
Ivan
Не так давно видел исследование что программисты в основном не понимаю floating point https://users.cs.northwestern.edu/~pdinda/Papers/ipdps18.pdf
Ivan
Главное знать что в этом представилении число 0.1 плюс число 0.2 не равно числу 0.3 (смешной сайтик про это https://0.30000000000000004.com/ )
Highly Likely
Не так давно видел исследование что программисты в основном не понимаю floating point https://users.cs.northwestern.edu/~pdinda/Papers/ipdps18.pdf
Достаточно знать, что при floating points нельзя адекватно использовать операторы сравнения
Highly Likely
И держать в голове то, что в них есть ошибка после n-го символа
Highly Likely
Этого достаточно, чтобы чаще всего не отстрелить себе ногу
Snusmumriken
Достаточно знать, что при floating points нельзя адекватно использовать операторы сравнения
Обычно можно больше-меньше, но не стоит чекать точное равенство. На равенство чекаем после округления до какого-нибудь знака после запятой.
Лепикоршев
я уже запарился😢
Не знаю, актуально ли, но: 1. Когда ты создаёшь lamp.__index = lamp; и setmetatable( x, lamp ) ты делаешь возможным поиск по lamp, опредедённый внутри же lamp, как в метатаблице твоей таблицы. Только поиск, больше ничего. 2. А когда ты делаешь { __index = lamp }, ты делаешь поиск по таблице lamp, а вот метатаблица у тебя будет другой - той, которую ты создал.
Лепикоршев
а еще значение __index может быть не таблицей, а функцией =)
Мне тут снус выше наглядно показал, что __index - функция работает медленнее, чем __index - таблица. Так что неочевидно, стоит ли вообще использовать.
Snusmumriken
В общем-то пофигу.
Snusmumriken
Функции дают больше возможностей (множественные наследования, "приватные" свойства и всякая такая дичь). Таблички — побыстрее. Но в норме, мы не особо паримся о скорости, не-так-часто-вызываемые объекты могут быть какими угодно.
Snusmumriken
Так что просто не цепляем к частовызываемой фигне (векторы-матрицы, например) методы с функциями.
Лепикоршев
Я некоторые вещи сразу оцениваю через O(n), чтобы потом не мучиться от болей в простреленном колене =)
Snusmumriken
Сделай функцию __index со сложностью O(n) (т.е. O(1)), и не парь моск ни себе ни другим : )
Лепикоршев
Таблица быстрее, ты сам доказал =) Так что функции - для редких исключений ;)
Snusmumriken
Ты не очень "впопад" сказал про сложность, потому что тут шо таблица шо функция — оба в норме имеют примерно одинаковую сложность, и не зависят от кол-ва элементов чего либо. Просто табличка чутка быстрее, но независимо от количества чего либо.
Лепикоршев
Время обработки будет различаться почти вдвое, если у тебя __index = {} относительно __index = function()end
Snusmumriken
Ох, основную часть времени будет сжирать всё-таки не поиск метода через таблицу или функцию, а его вызов.
Snusmumriken
Оптимизация пяти процентов — глупость.
Лепикоршев
а зачем себе же мину в будущее закладывать? Тратить 5%, когда можно не тратить?
Snusmumriken
Вот если ты точно знаешь что объекты будут вызываться очень часто, а их методы практически не занимают времени — тут нормально оптимизировать, у тебя есть эта информация.
Snusmumriken
а зачем себе же мину в будущее закладывать? Тратить 5%, когда можно не тратить?
Это называется "преждевременная оптимизация", и она — глупость по умолчанию.
Snusmumriken
А так ты сделаешь куда менее удобные интерфейсы чем мог бы.
Лепикоршев
Не соглашусь, если ты это сделал один раз, а потом все метатаблицы этой фабрикой фигачишь. Как говорится, научился летать, долетел за час.
Snusmumriken
А так ты сделаешь куда менее удобные интерфейсы чем мог бы.
* потратив на это кучу времени, и потратив тонну времени возни с эксплуатацией этих "оптимизированных" штук ))
Snusmumriken
А неудобство в снижении возможного функционала. Допустим, тебе надо не просто вызывать методы, а ещё записывать это. Можно было бы использовать автоматическое логирование в __index'е, например: что вызывается, с какими аргументами и в каком порядке. А так — ты такой ручками при каждом вызове логируешь, ууу, страшна ))
Snusmumriken
Карочи, цени то что тебе дают больше возможностей, и то что ты можешь выбирать: использовать то или это. А забивание болта на всю ветку потому что "эта медленна" — самая настоящая глупость, я гарантирую.
Snusmumriken
И нет тут никаких мин. Настоящие мины — это немножко другое. Это когда ты такой добавляешь в коллекцию элементы, а они такие, после набора нескольких, внезапно начинают добавляться по полтора часа вместо трёх наносекунд. Вот это — мина. А тут — не мина, а всё тот же условный O(1) ))
Лепикоршев
Карочи, цени то что тебе дают больше возможностей, и то что ты можешь выбирать: использовать то или это. А забивание болта на всю ветку потому что "эта медленна" — самая настоящая глупость, я гарантирую.
Что мешает создать две фабрики - быструю и медленную? Когда нужно логирование - тогда и используешь функции. Зачем что-то использовать там, где оно не нужно, да ещё и время лишнее ест?
Лепикоршев
Нельзя сделать универсальный автомат, чем-то всё равно придётся пожертвовать. Но по умолчанию жертвовать временем выполнения... ну, на мой взгляд, так себе идея)
Snusmumriken
Как всегда, вопрос целесообразности. Оно не сожрёт и толики того, сколько сожрано уже другим говнокодом совсем рядом. Жертвовать 0.005-5% времени выполнения ради комфорта использования и скорости написания/отладки — это нормально и даже хорошо.
Snusmumriken
Удобные апи — стоят того чтобы быть "не самыми оптимизированными в мире"
Лепикоршев
Мм, в данном случае - ты о комфорте программиста?) В чём будет страдать комфорт-то? Напиши один раз, вызывай когда нужно, и только там, где нужен функционал сверх - допиши.
Snusmumriken
Ты экономишь три копейки ради непонятно чего, когда мог бы сэкономить десять рублей, сделав нормальным что-то совсем другое, где у вас настоящие просадки а не эта фигня.
Лепикоршев
"Ну важно, какой процент, важно, с какой суммы" =)
Snusmumriken
Карочи, ты меня понял?
Лепикоршев
Понял. Не согласен ;)
Snusmumriken
Вот и молодец : ) Я долго работал и с тем и с тем, и с "переоптимизированным" лигаси (которое стало лигаси именно из-за преждевременных оптимизаций) тоже, и с супер-удобными апи, которые ценой чуть большего времени исполнения оказывались гораздо лучше чем могли бы. И первое — это жопа, никто не хочет этим пользоваться, и фичи туда не внедришь. А второе — конфетка, и все хотят этим пользоваться : )
Лепикоршев
Я чаще вижу обратную картину - и в легаси переходит то, что не справляется с нагрузкой
Snusmumriken
И что ты будешь делать, если встретишься с таким лигаси?
Snusmumriken
То что сделает любой нормальный человек — врубит профилировщик и посмотрит что жрёт больше всего, и глянет где надо ковырнуть, оптимизировав маленький кусочек кода, занимающий 80% времени. Если проблематично — увы, переписывание под новые требования.
Лепикоршев
Мм, у меня такое чувство, что мы про какие-то разные штуки начали говорить.
Snusmumriken
Я говорю про крупные системы которые пишутся не одним человеком, где как раз часто встречаются проблемы оптимизации, потому что кто-то натыкал "работает и ладно".
Snusmumriken
Но, всё о чём я тебе втолковываю — не ударяться в крайности и действовать по ситуации. Ты никогда не напишешь худо-бедно объёмного кода, работающего с предельной скоростью, но ты потратишь кучу времени своей собственной жизни (которая у тебя одна, межпрочим) в перекапывании своих же "ненужных оптимизаций" в будущем, когда что-то сломается или понадобится новая фича. Вся работа программиста — баланс комфорта использования и будущей поддержки со скоростью исполнения. Нет какого-то шаблона "как делать", потому что ситуации разные. В противном случае, программиста можно было бы заменить на оптимизирующий компилятор, которому говоришь: "хочу чтобы было зашибись", и он такой делает зашибись )) А ты загоняешься в крайность, как самый настоящий ситх, возводящий всё в абсолют ))
Snusmumriken
Карочи, в __index как в функции нет ничего плохого, оно есть, оно приемлемо работает, просто учитываем что оно линейно чуть медленнее чем табличка, и не ставим её на сверхзагруженные объекты, где профит от быстрого поиска методов будет играть хоть какую-то роль.
Lucky
Ух ты, сталкеристы в чяти!
Anonymous
Делайте на них репорты сразу
Snusmumriken
Уточнение: репорты на спамеров, не на сталкеристов
Igor
Сталкеристы тоже народ особенный
Igor
Нелюдимые какие-то
Yuriy
Насколько здоровая мысль - "написать Android приложение полностью на Lua"? Делают ли коммерческие проекты на Lua под Android?
Highly Likely
Если игры, то очень даже и делают
Приложения, насколько мне известно, тоже
Yuriy
Спасибо😊
Arslan
Andlua....
Ого. Lua написанный на java
🐅🤦‍♂️
Насколько здоровая мысль - "написать Android приложение полностью на Lua"? Делают ли коммерческие проекты на Lua под Android?
Love2d еще норм собирается на Андроид. Бинарник правда довольно жирный получается. Непонятно только чем лучше писать на Луа.
Yuriy
А что можете сказать про Gideros?
🐅🤦‍♂️
🤷‍♀
Mikhail
Зачем вообще игры
Highly Likely
Напоминаю, что мы очень неприветствуем такого рода выражения и поведение. Первое и последнее предупреждение.
Anonymous
Всем привет
Anonymous
Народ, выручайте советом)
Anonymous
Не могу исправить никак ошибку в скрипте под Game Guardian
Anonymous
Вообщем сбой в этом моменте: Мне нужно из адресса получить значение:
Anonymous
Anonymous
Anonymous
Anonymous
Anonymous
Как бы раньше я делал так: local ch1 = tonumber((st2[a].address)-2^32)
Anonymous
И ch1 уже получалось нужное значение
Anonymous
Как бы раньше я делал так: local ch1 = tonumber((st2[a].address)-2^32)
Но на новых версиях игры и андроида, значения теперь динамические, тоесть не всегда негативные, а так-возвращает негатив
Anonymous
Как правильно переобразовывать адрес в число?