Итак делаю более структурированный пост чем был до этого...
Для показания производительности используются:
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
Так же стоит отметить что не один из перечисленных способов не требует выделения памяти.
Вот все что смог более менее конкретное накопать и проверить. Прошу кинуть в лицо ошибки или вопросы. Вместе подумаем.... Теперь поправили.