Лидеры
Популярный контент
Показан контент с высокой репутацией 11.04.2021 в Сообщения
-
3 балла
-
2 баллаТут ошибочка получается. У тебя print в памяти остается ?:/ Так что каждый раз нужно в переменную записывать. local a,b = 23,76 local computer = require("computer") local mem0 = computer.freeMemory() for i=1,1e7 do a,b=b,a end print(mem0 - computer.freeMemory()) -- Результат: 0 mem0 = computer.freeMemory() for i=1,1e7 do a=a~b b=a~b a=a~b end print(mem0 - computer.freeMemory()) print() mem0 = computer.freeMemory() print("test") print(mem0 - computer.freeMemory()) И вот что мне вывело:
-
2 баллаНужно нажать "MineOS" в верхнем левом углу -> Выйти Помню, раньше эта кнопка выходила в консоль, но сейчас почему-то этот вариант не работает, похоже, дело в том, что теперь MineOS является Standalone системой, и из нее такой функционал просто выпилили. Надеюсь, @ECS объяснит подробнее
-
1 баллНет, т.к. оська уже установлена. Тут полная аналогия с реальными компами: ставишь несколько осей на несколько загрузочных томов, а потом через биос выбираешь приоритетный том для загрузки. А биос можно использовать либо штатный, либо сторонний - в зависимости от предпочтений
-
1 баллДля сбавления нагрузки на сервер некоторые проекты уменьшают число тиков для прогруженных, но без игрока чанков. Лично я сталкивался с убавлением тиков пополам на 2 чанке от игрока и полной заморозкой на 3 чанке.
-
1 балл
-
1 баллПффф.. Ну, раз я влез в эту тему, то продолжу обсуждение. Не совсем. Как долго работает компьютер, скажет computer.uptime(), а os.clock() скажет, сколько из этого времени компьютер потратил на, собственно, вычисления. Конечно, с некоторыми оговорками, но в целом именно os.clock() позволяет оценить нагрузку, создаваемую тем или иным кодом на игровой сервер. Это грязный эксперимент с неправильной интерпретацией результата. В нём извлечение поля из таблицы выполняется два раза, о чём не упомянуто в описании. Также эксперимент не сообщает о том, имеет ли смысл создавать локальную переменную для функции math.sin, если её планируется использовать всего два раза. Или пять, например. Во всех экспериментах маловаты измеряемые интервалы времени. Но в этом они слишком малы. Шум легко может оказаться выше реальной разницы во времени. А шум есть всегда, даже при выполнении кода на оборудовании с избыточной мощностью. А здесь как раз именно шум не позволяет увидеть, что a,b = b,a имеет ровно ту же эффективность. Вообще, при интерпретации результатов следует сравнивать полученную разницу с шумовой, чтобы не делать преждевременных выводов. В этом месте я всё-таки ожидал увидеть экспериментальное подтверждение «эффективности» этого трюка. Но именно это заблуждение надо развеять в первую очередь. Эксперимент: local a,b = 23,76 local computer = require("computer") local mem0 = computer.freeMemory() for i=1,1e7 do a,b=b,a end print(mem0 - computer.freeMemory()) -- Результат: 0 for i=1,1e7 do a=a~b b=a~b a=a~b end print(mem0 - computer.freeMemory()) -- Результат: 6631 Результат: Обмен значений переменных через a,b=b,a потребляет ровно 0 дополнительной памяти и быстро работает. Зато обмен посредством XOR и память потребляет, и работает медленно, да ещё и код загромождает. Я не знаю, почему этот вредный совет транслируют на форумах программистов. Вне сомнений, в арсенале программиста должен быть трюк обмена переменных через исключающее или. Но зачем его тулить к месту и не к месту? Урок же вроде как про оптимизацию кода. И даже если бы этот трюк оказался эффективным, почему нет упоминания о том, что xor работает не для всех типов переменных? И раз пошёл такой разговор, разберу предыдущее обсуждение: Эффективнее со всех точек зрения. Lua для любых операций создаёт буферные переменные для хранения временных результатов. Но, в случае a,b=b,a они уничтожаются незамедлительно в отличие от xor. Операция a,b=b,aтребует на выполнение столько же времени, как три отдельных операции присваивания, но потребления памяти не увеличивает.
-
1 баллИтак делаю более структурированный пост чем был до этого... Для показания производительности используются: os.clock() - дает приблизительное время работы CPU во время исполнения программы. computer.freeMemory() - дает нам узнать сколько памяти есть у компа. Локализация функций: Делайте функции в программе локальными. Это работает как и с локализацией существующих функций. Пример с функцией math.sin и ее локальной версией: local computer = require("computer") local unicode = require("unicode") local x = 0 local sin = math.sin local start = os.clock() local memory_start = 0 for i=1,1e5 do x = math.sin(i) end print("1e5 math.sin",os.clock()-start) start = os.clock() for i=1,1e5 do x = sin(i) end print("1e5 local.sin",os.clock()-start) --Замер для редкого вызова start = os.clock() x = math.sin(3) x = math.sin(10) x = math.sin(16) x = math.sin(42) print("rare math.sin",os.clock()-start) start = os.clock() x = sin(3) x = sin(10) x = sin(16) x = sin(42) print("rare local.sin",os.clock()-start) --Замер для одиночного вызова memory_start = computer.freeMemory() -- проверка на кушание памяти start = os.clock() x = math.sin(42) print("one math.sin",os.clock()-start, "memory take", memory_start-computer.freeMemory()) x = 0 memory_start = computer.freeMemory() local sin2 = math.sin start = os.clock() x = sin2(42) print("one local.sin2",os.clock()-start, "memory take",memory_start-computer.freeMemory()) Из данных тестов видно что локализация функций имеет смысл при частом обращении, но в случае же одиночного вызова функции смысла это не придает и на ход поршней особо сильно не влияет... Так же я решил проверить данный метод на openOS библиотеке unicode local computer = require("computer") local unicode = require("unicode") local x = 0 local start = os.clock() local memory_start = 0 local un_len = unicode.len for i=1,1e5 do x = unicode.len(tostring(i)) end print("1e5 unicode.len",os.clock()-start) start = os.clock() for i=1,1e5 do x = un_len(i) end print("1e5 local.len",os.clock()-start) --Замер для редкого вызова start = os.clock() x = unicode.len("Арбуз") x = unicode.len("Помидор") x = unicode.len("Капитализм") x = unicode.len("Ракета") print("rare unicode.len",os.clock()-start) start = os.clock() x = un_len("Арбуз") x = un_len("Помидор") x = un_len("Капитализм") x = un_len("Ракета") print("rare local.len",os.clock()-start) --Замер для одиночного вызова memory_start = computer.freeMemory() -- проверка на кушание памяти start = os.clock() x = unicode.len("Hello world!") print("one unicode.len",os.clock()-start, "memory take", memory_start-computer.freeMemory()) x = 0 memory_start = computer.freeMemory() local un_len2 = unicode.len start = os.clock() x = un_len2("Hello world!") print("one local.len",os.clock()-start, "memory take",memory_start-computer.freeMemory()) Тут же прирост в производительности не особо заметен. Так что стоит отдельно проверять библиотеку или функцию на эффективность такой локализации. Так же можно локализовать и свои функции: local computer = require("computer") local x = 0 local start = 0 local memory_start = 0 memory_start = computer.freeMemory() function func1(a,b) return a + b end start = os.clock() x = func1(9,0.3) print("norm func",os.clock()-start, "memory take",memory_start-computer.freeMemory()) memory_start = computer.freeMemory() local func2 = function(a,b) return a + b end start = os.clock() x = func2(9,0.3) print("local func",os.clock()-start, "memory take",memory_start-computer.freeMemory()) start = os.clock() for i=1,1e5 do local x = func1(i,i) end print("func1 \t",os.clock()-start) start = os.clock() local sin = math.sin for i=1,1e5 do local x = func2(i,i) end print("func2 \t",os.clock()-start) Так же стоит понимать что все зависит от вашей функции, но все же можно лишний раз локализовать... Вроде на ход поршней не влияет.... Главное не локализовывать функции в программе которые вызываются один раз. Это вообще не даст ничего и даже наоборот может замедлить работу (если таких функций много). Локальные переменные Используйте локальные переменные в зависимости от своей задачи. Если вам нужно сэкономить память то создавайте локальные переменные в функциях а если вам нужна переменная которая нужна множеству функций то лучше ее объявить глобально. Локальные переменные в функциях удаляются после завершения работы функции что позволяет сэкономить место в памяти. --var_global local computer = require("computer") local memory_start = computer.freeMemory() local test_table = {1,2,3,4,5,6,7,8,9,10} function work_on_test_table() --Что то делаем с test_table end print("memory take", memory_start - computer.freeMemory()) --var_local local computer = require("computer") local memory_start = computer.freeMemory() function work_on_test_table() local test_table = {1,2,3,4,5,6,7,8,9,10} --Что то делаем с test_table end print("memory take", memory_start - computer.freeMemory()) Подготовка объектов (таблиц) Лучше подготовить таблицу с частью необходимых значений и их уже дополнять. print("create obj") start = os.clock() local t = {} for i = 1970, 2000 do t[i] = os.time({year = i, month = 6, day = 14}) end print("direct insertion time", os.clock()-start) start = os.clock() t = {} local aux = {year = nil, month = 6, day = 14} for i = 1970, 2000 do aux.year = i t[i] = os.time(aux) end print("prepared insert time", os.clock()-start) start = os.clock() for i = 1, 1e5 do local a = {} a[1]=1; a[2] = 2; a[3] = 3 end print("num insert", os.clock()-start) start = os.clock() for i = 1, 1e5 do local a = {true,true,true} a[1]=1; a[2] = 2; a[3] = 3 end print("prepared insert", os.clock()-start) X*X вместо X^2 Если нам нужна 2 степень числа то быстрее это будет умножить чем возводить в степень, Но если у нас уже 3 степень или больше то данный финт бесполезен. local start = os.clock() for i=1,1e7 do local x = i * i end print("*",os.clock()-start) start = os.clock() for i=1,1e7 do local x = i ^ 2 end print("^",os.clock()-start) start = os.clock() for i=1,1e7 do local x = i * i * i * i * i end print("* X5",os.clock()-start) start = os.clock() for i=1,1e7 do local x = i ^ 5 end print("^ 5",os.clock()-start) Swap переменных Самый быстрый способ это использовать временную переменную, красивый и почти такой же эффективный метод перестановки переменных будет a,b = b,a Так же стоит отметить что не один из перечисленных способов не требует выделения памяти. Вот все что смог более менее конкретное накопать и проверить. Прошу кинуть в лицо ошибки или вопросы. Вместе подумаем.... Теперь поправили.
-
1 баллИзначально я не хотел комментировать этот «урок», т.к. объём комментариев в несколько раз превысил бы изначальный текст. Главная претензия к нему в отсутствии конкретики и каких-либо примеров, позволяющих читателю прийти к тем же выводам. @Taruu , приведя конкретный пример, спасает этот урок. Если кто-то хочет продолжить это начинание, я прошу не скидывать все замеры в одну программу, или хотя бы в коде одной программы дробить код на блоки и добавлять короткое описание, что именно там измеряется. Например, так: Демонстрация: локальная функция sin работает в два раза быстрее, чем функция math.sin. Замедление происходит два раза: при извлечении поля math из таблицы глобальных переменных и при извлечении поля sin из таблицы math. кусочек кода Также можно привести ещё пример, демонстрирующий, что работа с глобальной переменной равносильна работе с полем таблицы. А ещё важно продемонстрировать, начиная с какого числа использований становится выгодным копировать функцию math.sin в локальную переменную. Потому что если бездумно повторять советы из этого «урока», то вместо оптимизации может получиться пессимизация. Также я советую для записи чисел с большим количеством нулей использовать научную форму. Чтобы понять, сколько нулей содержит число 100000, мне приходится задерживать взгляд на этом числе, а запись 1e5 считывается мгновенно.
Эта таблица лидеров рассчитана в Москва/GMT+03:00
