MrAbad
Пользователи-
Публикации
46 -
Зарегистрирован
-
Посещение
-
Победитель дней
4
Тип публикации
Блоги
Профили
Форум
Багтрекер
Магазин
Все публикации пользователя MrAbad
-
Ты в третьей строке забыл скобочки у функции component.reactor.getHeat()
- 4 ответа
-
- 3
-
-
-
не отрицаю, что поверхностно, это в основном просто перевод заметки с заморского форума, в будущем постараюсь что-то по-глубже делать В конце концов моя цель частично достигнута, есть тема, где есть кладесь информации, по-оптимизации кода
- 18 ответов
-
- lua 5.3
- opencomputers
-
(и ещё 1 )
Теги:
-
ну во-первых можно обойтись и без них, во-вторых просто оболочка функции занимает 1/10 килобайта, то есть просто замыкание, которое ничего не делает использует 2/10 килобайта. Согласен, что в некоторых ситуациях они могут быть полезны, но в том же пресловутом EEPROM'е не до красивой архитектуры с функциональным программированием
- 18 ответов
-
- 1
-
-
- lua 5.3
- opencomputers
-
(и ещё 1 )
Теги:
-
В Lua эта конструкция создает буферную переменную a, b = b, a --> local с = a a = b b = c
- 18 ответов
-
- 2
-
-
- lua 5.3
- opencomputers
-
(и ещё 1 )
Теги:
-
Решил я как-то поискать методы оптимизации кода для ОпенКомпов, и Луа в целом. Но на форуме, вроде, я не нашел тему, где в одном месте сконцентрированы вещи, помогающие в оптимизации. Разве что нашел одну ветку, на заморском форуме, вот ее компиляция/перевод/адаптация/дополнение: (за помощь в переводе, спасибо KoshakLol и Google Translate) # Место в памяти Вот таблица, где есть, сколько что занимает в памяти: boolean, number и string занимают 9 байт. Указатель на функцию, или на таблицу, тоже 9 байт. Пустая функция (function() end) занимает 93 байт, пустая функция с return (function() return true end) занимает 102 байт. Пустая таблица занимает 36 байт, плюс за каждую степень двойки (2^n) еще дополнительно: 9 байт для 0-1 элементов в таблице 18 байт для 2 элементов в таблице 36 байт для 3-4 элементов в таблице 71 байт для 5-8 элементов в таблице 142 байт для 9-16 элементов в таблице 284 байт для 17-32 элементов в таблице 569 байт для 33-64 элементов в таблице и т.д. И, кстати, таблицы не сжимаются, то есть если туда запихать 1000 элементов, а потом удалить их, то весить она будет, как будто в ней все еще 1000 элементов # Сборка мусора Автоматический сборщик мусора в опенкомпах вроде бы отключен, и вызывается только через os.sleep(0), и то не гарантированно, так что разработчик мода советует его вызывать 10 раз подряд, чтоб уж точно И еще, автоматический сборщик чистит ТОЛЬКО локальные переменные # Советы сомнительной эффективности (от них я не засек прироста) Убрать из кода деление, потому что оно, якобы, медленнее, чем умножение (условно:) local a = n / 4 --> local a = n * 0.25 Заменить все условные операторы, на логические тернарные операторы, где это возможно (условно:) if (a > b) then c = a else c = b end --> c = (a > b) and a or b (Если вы не поняли, что сейчас вообще было, то в этой теме все расписано) Менять переменные местами, без буфера (Lua 5.3+) local a = 174 local b = 3 a = a ~ b b = a ~ b a = a ~ b print(a) --> 3 print(b) --> 174 (Если вы не поняли, что сейчас вообще было, то ищите битовую операцию XOR) Этот совет дает хотя бы небольшой прирост, из-за того, что нет лишний переменной, но этот плюс нивелируется, если ее удалить # В итоге Не используйте рекурсию функций, а если совсем приспичило, то почаще вставляйте сбор мусора Не используйте замыкания (это когда функция возвращает другую функцию) Старайтесь не использовать таблицы, вместо них лучше делать так: local coords = {x = 10, y = 20, z = 370} -- (72 байта) --> local x = 10 local y = 20 local z = 370 -- (27 байт) -- или вообще local xyz = 010020370 -- (9 байт) print("z = ", xyz // 1000000, "\ny = " , xyz // 1000 % 1000, "\nz = ", xyz % 1000) -- (Если вы не поняли, что сейчас вообще было, то ищите деление с остатком) Старайтесь не использовать не-локальные переменные, так как они бьют по архитектуре программы, и их не собирает гарбадж коллектор # P.S В данной заметке рассматривалась только сторона оптимизации кода, определенный код может отвратительно выглядеть, но работать быстро, и наоборот, в реальных программах лучше соблюдать баланс, между красотой, и быстродействием, в какой-нибудь программе для EEPROM'a, допустим, вообще о красоте кода не идет и речи Ну это в целом все, что я хотел рассказать, если есть исправления/уточнения/дополнения/свои_идеи, то милости прошу в комментарии
- 18 ответов
-
- 5
-
-
-
- lua 5.3
- opencomputers
-
(и ещё 1 )
Теги:
-
OpenComputers сложнее, чем ComputerCraft, но у него сильно больше функциональности
-
Тю, это разве CC? Если так, то дико извиняюсь, и советую перейти на OC аффтару
-
для того, чтобы использовать библиотеку shell, ее надо подключить в программу: local shell = require("shell")
-
Конечно прошло 5 лет, но вставлю свои 5 копеек, тут как в анекдоте "и не в шахматы, а в карты, и не выиграл, а проиграл..."
-
Хорошо, можно так: ("MyClosure.lua") function MyClosure(a, b) self = {} readOnly = { var1 = true } self.a = a self.b = b function self.printAandB() print(self.a, self.b) end function self.GET(var) return readOnly[var] end return self end ("main.lua") require("MyClosure") local obj1 = MyClosure(3,14) obj1.printAandB() --> 3 14 print(obj1.GET("var1")) --> true Кстати, я не даром назвал файл "MyClosure", потому что, это не ООП, а в чистом виде замыкание и функциональное программирование
-
Прошу прощение за мое поведение 2 года назад, предлагаю закрыть тему
-
Я уже пару лет периодически читаю этот тред, и меня мучает вопрос, почему, нельзя просто произвести инкапсуляцию сокрытие для Рид-онли переменных, мой вариант: function Class1() local self = { ["var1"] = "Nothing" } local private = { ["var1"] = "Secret!" } function self.getVar1() print(self.var1) end function self.getPrivateVar1() return private.var1 end return self end В файле класса, и: require("class1") local myObject = Class1() print(myObject.getPrivateVar1()) --> Secret! в файле программы. По-идее к этой переменной никак не получить доступ
-
Как говорили выше стабильных вариантов нет, но если основная проблема выучить, то если ты знаешь Python, то это, думаю покажет основы, а дальше практика, практика и ничего, кроме практики
-
Ну есть у меня учебник "луа для чайников" Глава 1ايختبخيماب Для того, чтобы يحغصقهجهع Нужно تلبسبنمسسخ... и т.д.
-
Как? Уже пытался... Безуспешно.
-
Алекс удали пожалуйста. Написал это сообщиние случайно
-
Т.е. Графити лжёт?
-
http://imgur.com/knF8wp9
-
Показывает как сделать график на луа
-
А никто случайно не видел подробный и исчерпывающий гайд по графике
-
Когда прописываю "dir /" говорит, что я немогу туда пройти, потому что там инит.луа
-
1) Спасибо. Как ни странно помогло. 2) -- Это для того, чтобы на компьютере запускалось -- component = require("component") internet = component.proxy(component.list("internet")()) на биосе сработает?
