Перейти к содержимому

MrAbad

Пользователи
  • Публикации

    46
  • Зарегистрирован

  • Посещение

  • Победитель дней

    4

Все публикации пользователя MrAbad

  1. Ты в третьей строке забыл скобочки у функции component.reactor.getHeat()
  2. не отрицаю, что поверхностно, это в основном просто перевод заметки с заморского форума, в будущем постараюсь что-то по-глубже делать В конце концов моя цель частично достигнута, есть тема, где есть кладесь информации, по-оптимизации кода
  3. ну во-первых можно обойтись и без них, во-вторых просто оболочка функции занимает 1/10 килобайта, то есть просто замыкание, которое ничего не делает использует 2/10 килобайта. Согласен, что в некоторых ситуациях они могут быть полезны, но в том же пресловутом EEPROM'е не до красивой архитектуры с функциональным программированием
  4. В Lua эта конструкция создает буферную переменную a, b = b, a --> local с = a a = b b = c
  5. Решил я как-то поискать методы оптимизации кода для ОпенКомпов, и Луа в целом. Но на форуме, вроде, я не нашел тему, где в одном месте сконцентрированы вещи, помогающие в оптимизации. Разве что нашел одну ветку, на заморском форуме, вот ее компиляция/перевод/адаптация/дополнение: (за помощь в переводе, спасибо 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, допустим, вообще о красоте кода не идет и речи Ну это в целом все, что я хотел рассказать, если есть исправления/уточнения/дополнения/свои_идеи, то милости прошу в комментарии
  6. Ну эти требования настолько смехотворны, по сравнению, с условной, GNU GPL v3, что код под такой лицензией никак не защищен, от проприетарных пираний
  7. OpenComputers сложнее, чем ComputerCraft, но у него сильно больше функциональности
  8. Тю, это разве CC? Если так, то дико извиняюсь, и советую перейти на OC аффтару
  9. для того, чтобы использовать библиотеку shell, ее надо подключить в программу: local shell = require("shell")
  10. У тебя вообще лицензия MIT, и никто тебе ничего не должен )
  11. Конечно прошло 5 лет, но вставлю свои 5 копеек, тут как в анекдоте "и не в шахматы, а в карты, и не выиграл, а проиграл..."
  12. Однако соглашусь, что некоторые сходства с ООП есть. (Кстати, даже на Вики есть кусок про замыкания в Луа)
  13. Хорошо, можно так: ("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", потому что, это не ООП, а в чистом виде замыкание и функциональное программирование
  14. Прошу прощение за мое поведение 2 года назад, предлагаю закрыть тему
  15. Я уже пару лет периодически читаю этот тред, и меня мучает вопрос, почему, нельзя просто произвести инкапсуляцию сокрытие для Рид-онли переменных, мой вариант: 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! в файле программы. По-идее к этой переменной никак не получить доступ
  16. Как говорили выше стабильных вариантов нет, но если основная проблема выучить, то если ты знаешь Python, то это, думаю покажет основы, а дальше практика, практика и ничего, кроме практики
  17. Ну есть у меня учебник "луа для чайников" Глава 1ايختبخيماب Для того, чтобы يحغصقهجهع Нужно تلبسبنمسسخ... и т.д.
  18. Как? Уже пытался... Безуспешно.
  19. Алекс удали пожалуйста. Написал это сообщиние случайно
  20. Показывает как сделать график на луа
  21. А никто случайно не видел подробный и исчерпывающий гайд по графике
  22. Когда прописываю "dir /" говорит, что я немогу туда пройти, потому что там инит.луа
  23. 1) Спасибо. Как ни странно помогло. 2) -- Это для того, чтобы на компьютере запускалось -- component = require("component") internet = component.proxy(component.list("internet")()) на биосе сработает?
×
×
  • Создать...