MrAbad
-
Публикации
46 -
Зарегистрирован
-
Посещение
-
Победитель дней
4
Сообщения, опубликованные пользователем MrAbad
-
-
В 10.04.2021 в 17:16, eu_tomat сказал:Изначально я не хотел комментировать этот «урок», т.к. объём комментариев в несколько раз превысил бы изначальный текст. Главная претензия к нему в отсутствии конкретики и каких-либо примеров, позволяющих читателю прийти к тем же выводам.
не отрицаю, что поверхностно, это в основном просто перевод заметки с заморского форума, в будущем постараюсь что-то по-глубже делать
В конце концов моя цель частично достигнута, есть тема, где есть кладесь информации, по-оптимизации кода -
Только что, hohserg сказал:Почему?
ну во-первых можно обойтись и без них, во-вторых просто оболочка функции занимает 1/10 килобайта, то есть просто замыкание, которое ничего не делает использует 2/10 килобайта. Согласен, что в некоторых ситуациях они могут быть полезны, но в том же пресловутом EEPROM'е не до красивой архитектуры с функциональным программированием
-
1
-
-
8 часов назад, Zer0Galaxy сказал:А как на счет такого варианта?
a,b = b,aНа сколько это более/менее производительней чем пример с XORом? Во всяком случае это на много понятней и занимает меньше букв, что существенно, если программа лежит в EEPROM.
В Lua эта конструкция создает буферную переменную
a, b = b, a --> local с = a a = b b = c
-
2
-
-
Решил я как-то поискать методы оптимизации кода для ОпенКомпов, и Луа в целом. Но на форуме, вроде, я не нашел тему, где в одном месте сконцентрированы вещи, помогающие в оптимизации. Разве что нашел одну ветку, на заморском форуме, вот ее компиляция/перевод/адаптация/дополнение:
(за помощь в переводе, спасибо 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
-
В 22.03.2021 в 21:42, hohserg сказал:Неа, кое-че должен)
Ну эти требования настолько смехотворны, по сравнению, с условной, GNU GPL v3, что код под такой лицензией никак не защищен, от проприетарных пираний
-
10 минут назад, Grobovshik5121 сказал:Вы имеете ввиду Open Computers?
Есть ли какая-то функиональная разница между CC и OC?
OpenComputers сложнее, чем ComputerCraft, но у него сильно больше функциональности
-
5 минут назад, ECS сказал:Разве библиотека shell на ComputerCraft не глобальна? И существует ли там вообще require? Не os.loadAPI?
Тю, это разве CC? Если так, то дико извиняюсь, и советую перейти на OC аффтару
-
44 минуты назад, Grobovshik5121 сказал:А вот здесь меня, культурно говоря, послали нафиг, с ошибкой о том что программа/команда не существует
для того, чтобы использовать библиотеку shell, ее надо подключить в программу:
local shell = require("shell")
-
У тебя вообще лицензия MIT, и никто тебе ничего не должен )
-
В 06.05.2015 в 23:31, LeshaInc сказал:Я решил... ХТМЛ не будет.
Конечно прошло 5 лет, но вставлю свои 5 копеек, тут как в анекдоте
"и не в шахматы, а в карты, и не выиграл, а проиграл..." -
ЦитатаЗамыкание (англ. closure) в программировании — функция первого класса, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции в окружающем коде и не являющиеся её параметрами.
Однако соглашусь, что некоторые сходства с ООП есть.
(Кстати, даже на Вики есть кусок про замыкания в Луа)
-
В 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", потому что, это не ООП, а в чистом виде замыкание и функциональное программирование
-
Прошу прощение за мое поведение 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ايختبخيماب
Для того, чтобы يحغصقهجهع
Нужно تلبسبنمسسخ... и т.д.
-
1
-
-
ОС-компьютеры графический режим не поддерживают. Есть способы реализации псевдографики. На нашем форуме поищи.Как? Уже пытался... Безуспешно.
-
Алекс удали пожалуйста. Написал это сообщиние случайно
-
ОС-компьютеры графический режим не поддерживают. Есть способы реализации псевдографики. На нашем форуме поищи.Т.е. Графити лжёт?
-
Так все на офф вики есть, в разделе gpu API. Там и примеры нормальные приведены. А еще лучше - ищи на ютубе все, что тебе нужно, и народу мозги не парь =)
-
Так все на офф вики есть, в разделе gpu API. Там и примеры нормальные приведены. А еще лучше - ищи на ютубе все, что тебе нужно, и народу мозги не парь =)Показывает как сделать график на луа
-
А никто случайно не видел подробный и исчерпывающий гайд по графике
Алекс название темы поменял а url - нет
З.Ы. уже поменял
-
Кстати, можешь сам зайти в корневую папку установленной OpenOS и прочитать что в этом файле хранится, если так интересно.
Когда прописываю "dir /" говорит, что я немогу туда пройти, потому что там инит.луа
-
1)
install прописывали ?
советую посмотреть гайды в youtubeСпасибо. Как ни странно помогло.
2)
-- Это для того, чтобы на компьютере запускалось -- component = require("component") internet = component.proxy(component.list("internet")())на биосе сработает?

Помогите со скриптом
в Помогите найти ошибку
Опубликовано:
Ты в третьей строке забыл скобочки у функции component.reactor.getHeat()