Таблицы
Код
local next = next
local function ret(t, n, last)
local c = t[n]
for i = n, last or #t do
t[i] = t[i + 1]
end
return c
end
function table.F_insert(t, T, n,last)
local nt = last or #t
if not n then
t[nt + 1] = T
return nt + 1
end
for i = nt, n, -1 do
t[i + 1] = t[i]
end
t[n] = T
return n
end
table.F_remove = ret
--Аналога нет
function table.F_fix(t, n)
local p = 0
local k = table_maxn(t) --Получаем последний ключ таблицы
for i = 1, k or 0 do
if t[i - p] ~= nil then continue end
if t[i] == nil then
p = p + 1
continue
end
t[i - p] = t[i]
t[i] = nil
end
end
Процессор Ryzen 3 3600 ~4.2ГГц
Сравнение Table.Insert с кастомным, вызваем 1,000,000 раз.
Код бенчмарка
local T={}
local N=1000000
print(‘-’)
local start = os.clock()
for i=1,N do
table.insert(T, N)
end
print('Стандарт без локализации, без аргумента в конце: ',os.clock()-start,‘Секунд’)
T={}
start = os.clock()
for i=1,N do
table.insert(T, i, N)
end
print('Стандарт без локализации, с аргументов в конце: ',os.clock()-start,‘Секунд’)
T={}
start = os.clock()
local table_insert=table.insert
for i=1,N do
table_insert(T, N)
end
print('Стандарт с локализацией, без аргумента в конце: ',os.clock()-start,‘Секунд’)
T={}
start = os.clock()
for i=1,N do
table_insert(T, i, N)
end
print('Стандарт с локализацией, с аргументом в конце: ',os.clock()-start,‘Секунд’)
T={}
start = os.clock()
for i=1,N do
table.F_insert(T, N)
end
print('Кастом без локализации, без аргумента в конце: ',os.clock()-start,‘Секунд’)
T={}
start = os.clock()
for i=1,N do
table.F_insert(T, N,i)
end
print('Кастом без локализации, с аргументом в конце: ',os.clock()-start,‘Секунд’)
local table_F_insert=table.F_insert
T={}
start = os.clock()
for i=1,N do
table_F_insert(T, N)
end
print('Кастом с локализацией, без аргумента в конце: ',os.clock()-start,‘Секунд’)
T={}
start = os.clock()
for i=1,N do
table_F_insert(T, N,i)
end
print(‘Кастом с локализацией, с аргументом в конце: ‘,os.clock()-start,‘Секунд’)
print(’===’)
T={}
start = os.clock()
for i=1,N do
table.F_insert(T, N,i,i-1)
end
print('Кастом без локализации, с аргументом в конце, с #Table: ',os.clock()-start,‘Секунд’)
T={}
start = os.clock()
for i=1,N do
table.F_insert(T, N,nil,i-1)
end
print('Кастом без локализации, без аргумента в конце, с #Table: ',os.clock()-start,‘Секунд’)
T={}
start = os.clock()
for i=1,N do
table_F_insert(T, N,nil,i-1)
end
print('Кастом с локализацией, без аргумента в конце, с #Table: ',os.clock()-start,‘Секунд’)
T={}
start = os.clock()
for i=1,N do
table_F_insert(T, N,i,i-1)
end
print('Кастом с локализацией, с аргументом в конце, с #Table: ',os.clock()-start,‘Секунд’)
Результат
Стандарт без локализации, без аргумента в конце: 0.052999999999997 Секунд
Стандарт без локализации, с аргументов в конце: 0.085000000000008 Секунд
Стандарт с локализацией, без аргумента в конце: 0.051999999999992 Секунд
Стандарт с локализацией, с аргументом в конце: 0.079999999999984 Секунд
Кастом без локализации, без аргумента в конце: 0.053000000000026 Секунд
Кастом без локализации, с аргументом в конце: 0.058999999999997 Секунд
Кастом с локализацией, без аргумента в конце: 0.055999999999983 Секунд
Кастом с локализацией, с аргументом в конце: 0.055000000000007 Секунд
Кастом без локализации, с аргументом в конце, с #Table: 0.0049999999999955 Секунд
Кастом без локализации, без аргумента в конце, с #Table: 0.0039999999999907 Секунд
Кастом с локализацией, без аргумента в конце, с #Table: 0.0040000000000191 Секунд
Кастом с локализацией, с аргументом в конце, с #Table: 0.0049999999999955 Секунд
Сравнение Table.Remove с кастомным, вызваем 1,000 раз, в таблице с 1,000,000 ключей
Код бенчмарка
local T={}
local N=1000000
for i=1,N do
T[i]=N
end
local table_remove=table.remove
local table_F_remove=table.F_remove
local start = os.clock()
for i=1,1000 do
table.remove(T)
end
print('Стандарт без локализации, без аргумента : ',os.clock()-start,'Секунд')
T={}
for i=1,N do
T[i]=N
end
local start = os.clock()
for i=1,1000 do
table_remove(T, 1)
end
print('Стандарт с локализацией, без аргумента : ',os.clock()-start,'Секунд')
T={}
for i=1,N do
T[i]=N
end
for i=1,N do
T[i]=N
end
local start = os.clock()
for i=1,1000 do
table.remove(T, 1)
end
print('Стандарт без локализации, с аргументом : ',os.clock()-start,'Секунд')
T={}
for i=1,N do
T[i]=N
end
local start = os.clock()
for i=1,1000 do
table_remove(T, 1)
end
print('Стандарт с локализацией, с аргументом : ',os.clock()-start,'Секунд')
T={}
for i=1,N do
T[i]=N
end
local start = os.clock()
for i=1,1000 do
table.F_remove(T, 1)
end
print('кастом без локализации, с аргументом : ',os.clock()-start,'Секунд')
T={}
for i=1,N do
T[i]=N
end
local table_F_remove=table.F_remove
local start = os.clock()
for i=1,1000 do
table_F_remove(T, 1)
end
print('кастом с локализацией, с аргументом ',os.clock()-start,'Секунд')
T={}
for i=1,N do
T[i]=N
end
local start = os.clock()
for i=1,1000 do
table.F_remove(T,N-(i-1))
end
print('кастом без локализации, без аргумента : ',os.clock()-start,'Секунд')
T={}
for i=1,N do
T[i]=N
end
local start = os.clock()
for i=1,1000 do
table_F_remove(T,N-(i-1))
end
print('кастом с локализацией, без аргумента: ',os.clock()-start,'Секунд')
Результат
Стандарт без локализации, без аргумента : 0 Секунд
Стандарт с локализацией, без аргумента : 0 Секунд
Стандарт без локализации, с аргументом : 1.215 Секунд
Стандарт с локализацией, с аргументом : 1.21 Секунд
Кастом без локализации, с аргументом : 0.673 Секунд
Кастом с локализацией, с аргументом 0.673 Секунд
Кастом без локализации, без аргумента : 0 Секунд
Кастом с локализацией, без аргумента: 0 Секунд
Кастомный Table.Remove не поддерживает отсутствие аргумента, по этому был имитирован через N-(i-1), где N колличество изначальных ключей, где i сколько отнимаем через for. Но возвращает удалённое значение!
Так же в коде предоставлена доп функция table.F_fix убирает пустоты в таблицах
[1]=1,[2]=2,[6]=6,[50]=50 |==> [1]=1,[2]=2,[3]=6,[4]=50