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

MrAbad

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

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

  • Посещение

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

    4

Сообщения, опубликованные пользователем MrAbad


  1. В 10.04.2021 в 17:16, eu_tomat сказал:

    Изначально я не хотел комментировать этот «урок», т.к. объём комментариев в несколько раз превысил бы изначальный текст. Главная претензия к нему в отсутствии конкретики и каких-либо примеров, позволяющих читателю прийти к тем же выводам.

    не отрицаю, что поверхностно, это в основном просто перевод заметки с заморского форума, в будущем постараюсь что-то по-глубже делать
    В конце концов моя цель частично достигнута, есть тема, где есть кладесь информации, по-оптимизации кода


  2. Только что, hohserg сказал:

    Почему?

    ну во-первых можно обойтись и без них, во-вторых просто оболочка функции занимает 1/10 килобайта, то есть просто замыкание, которое ничего не делает использует 2/10 килобайта. Согласен, что в некоторых ситуациях они могут быть полезны, но в том же пресловутом EEPROM'е не до красивой архитектуры с функциональным программированием

    • Грусть 1

  3. 8 часов назад, Zer0Galaxy сказал:

    А как на счет такого варианта?

    
    a,b = b,a

    На сколько это более/менее производительней чем пример с XORом? Во всяком случае это на много понятней и занимает меньше букв, что существенно, если программа лежит в EEPROM.

    В Lua эта конструкция создает буферную переменную

    a, b = b, a
    -->
    local с = a
    a = b
    b = c

     

    • Нравится 2

  4. Решил я как-то поискать методы оптимизации кода для ОпенКомпов, и Луа в целом. Но на форуме, вроде, я не нашел тему, где в одном месте сконцентрированы вещи, помогающие в оптимизации. Разве что нашел одну ветку, на заморском форуме, вот ее компиляция/перевод/адаптация/дополнение:
    (за помощь в переводе, спасибо 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, допустим, вообще о красоте кода не идет и речи
    Ну это в целом все, что я хотел рассказать, если есть исправления/уточнения/дополнения/свои_идеи, то милости прошу в комментарии

    • Нравится 2
    • Спасибо 3

  5. В 22.03.2021 в 21:42, hohserg сказал:

    Неа, кое-че должен)

    https://en.wikipedia.org/wiki/MIT_License

    Ну эти требования настолько смехотворны, по сравнению, с условной, GNU GPL v3, что код под такой лицензией никак не защищен, от проприетарных пираний 


  6. 44 минуты назад, Grobovshik5121 сказал:

    А вот здесь меня, культурно говоря, послали нафиг, с ошибкой о том что программа/команда не существует

    для того, чтобы использовать библиотеку shell, ее надо подключить в программу:

    local shell = require("shell")

  7. Цитата

    Замыкание (англ. closure) в программировании — функция первого класса, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции в окружающем коде и не являющиеся её параметрами.

    360261219_.png.914d419691e1971c881611f715d05b8f.png

    Однако соглашусь, что некоторые сходства с ООП есть.

    (Кстати, даже на Вики есть кусок про замыкания в Луа)1239952949_.png.dad02d878340e05f8eed5e4ff2e1d776.png


  8. В 23.12.2019 в 12:25, Zer0Galaxy сказал:

    Для каждого рид-онли поля каждого экземпляра объекта необходимо создавать отдельную функцию.

    Хорошо, можно так:
    ("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", потому что, это не ООП, а в чистом виде замыкание и функциональное программирование


  9. Я уже пару лет периодически читаю этот тред, и меня мучает вопрос, почему, нельзя просто произвести инкапсуляцию сокрытие для Рид-онли переменных, мой вариант:

    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!

    в файле программы.
    По-идее к этой переменной никак не получить доступ


  10. ну это дааа. Зря он в графоний полез, если не знает, как и что и где искать даже.

     

    Да и не нужны ему программы чьи-то видимо. Если он не знает луа, то чужие программки ему не помогут.

    Плохо, что у нас на форуме нет практически никакой серии гайдов  от "А до Я по ос-ке или луа".

    Что-то типа "кусочек кода -> выхлоп и что он делает". "Блок или адаптер какой-то или апгрейд -> код -> выхлоп и подробно, как и почему так оно работает. То есть базовая серия примеров конкретных коротких с описанием в виде кашицы разжеваной.

     

    Форум вроде и забит немного какими-то программками (сложными или простыми) и вдобавок всяким мусором и флудом, но новичку от них толку никакого, так как он не понимает вовсе, что там и где какая программка именно принтит  хелоуворлд, а где рисуется псевдопиксель, а где таблица и цикл. Для них это просто набор иероглифов и магии какой-то.

    Ну есть у меня учебник "луа для чайников"

    Глава 1ايختبخيماب

    Для того, чтобы يحغصقهجهع

    Нужно تلبسبنمسسخ... и т.д.

    • Нравится 1

  11. 1)

    install прописывали ?
    советую посмотреть гайды в youtube

    Спасибо. Как ни странно помогло.

    2)

    -- Это для того, чтобы на компьютере запускалось -- component = require("component")
    internet = component.proxy(component.list("internet")())
    

    на биосе сработает?

×
×
  • Создать...