Информация table.insert vs operator #

The Spark

Известный
Автор темы
653
670
Lua:
function deleteLine(filePath, text)
    local tableOfLines = {}  
    for line in io.lines(filePath) do
        if not u8:decode(line):find(text) then
            table.insert(tableOfLines, line)
        end
    end
    local file = io.open(filePath, 'w+')
    file:write(table.concat(tableOfLines), "\n")
    file:close()
end
Раз на то пошло. table.insert очень сильно тупит!

Lua:
function deleteLine(filePath, text)
    local tableOfLines = {}   
    for line in io.lines(filePath) do
        if not u8:decode(line):find(text) then
            tableOfLines[#tableOfLines + 1] = line
        end
    end
    local file = io.open(filePath, 'w+')
    file:write(table.concat(tableOfLines), "\n")
    file:close()
end
 

kizn

О КУ)))
Всефорумный модератор
2,405
2,054
Раз на то пошло. table.insert очень сильно тупит!

Lua:
function deleteLine(filePath, text)
    local tableOfLines = {}  
    for line in io.lines(filePath) do
        if not u8:decode(line):find(text) then
            tableOfLines[#tableOfLines + 1] = line
        end
    end
    local file = io.open(filePath, 'w+')
    file:write(table.concat(tableOfLines), "\n")
    file:close()
end
что? тупит?
 

Double Tap Inside

Известный
Проверенный
1,898
1,252
Это работает медленнее table.insert


Снимок.PNG
 
  • Bug
Реакции: Fott

The Spark

Известный
Автор темы
653
670
Оу, уже тему сделали для сратча, я ещё и автор, крутяк.
Мои выводы - http://bot4sale.ru/blog-menu/qlua/454-lua-optimization.html
+ опыт работы (при запуске игры происходила загрузка текстур в таблицу методом insert, а также паралельно шел рендр этих текстур. Иногда был микрофриз или же рендер прозрачной текстуры, вместо заданной. При операторе # не замечал такой проблемы)
 
Последнее редактирование:

imring

Ride the Lightning
Всефорумный модератор
2,355
2,516
я решил написать свой тест, что же всё-таки лучше (i/insert/#):
Lua:
for i = 1, 10 do
    local a = {}

    local start_i = os.clock()
    for l = 1, 10000000 do
        a[l] = 1
    end
    local end_i = os.clock()
    print(('i: %0.6f'):format(end_i-start_i))

    a = {}
    local start_insert = os.clock()
    for l = 1, 10000000 do
        table.insert(a, 1)
    end
    local end_insert = os.clock()
    print(('table.insert: %0.6f'):format(end_insert-start_insert))

    a = {}
    local start_len = os.clock()
    for l = 1, 10000000 do
        a[#a + 1] = 1
    end
    local end_len = os.clock()
    print(('#: %0.6f'):format(end_len-start_len))

    print()
end

и вот такие результаты получились (спасибо @memir):
Windows 10
Код:
i: 0.099000
table.insert: 0.996000
#: 0.997000

i: 0.092000
table.insert: 0.984000
#: 1.012000

i: 0.110000
table.insert: 0.998000
#: 1.015000

i: 0.138000
table.insert: 0.974000
#: 1.004000

i: 0.113000
table.insert: 0.980000
#: 1.028000

i: 0.090000
table.insert: 1.000000
#: 1.046000

i: 0.105000
table.insert: 0.999000
#: 0.987000

i: 0.095000
table.insert: 1.150000
#: 1.019000

i: 0.099000
table.insert: 0.995000
#: 1.000000

i: 0.127000
table.insert: 1.028000
#: 1.020000

WSL (ubuntu 20.04):
Код:
i: 0.080637
table.insert: 0.957684
#: 0.985697

i: 0.073816
table.insert: 0.981048
#: 0.983238

i: 0.044314
table.insert: 1.035425
#: 0.988684

i: 0.105307
table.insert: 1.050751
#: 1.373946

i: 0.075393
table.insert: 1.086102
#: 1.200062

i: 0.084778
table.insert: 1.007491
#: 1.164351

i: 0.084937
table.insert: 1.037412
#: 1.196782

i: 0.137155
table.insert: 1.122287
#: 1.076802

i: 0.173429
table.insert: 1.165676
#: 1.289743

i: 0.044538
table.insert: 1.117546
#: 1.184680

i оказался лучше всех, а table.insert и # +- на равне

Замерять скорость работы через clock🤡
а чем же ещё?

гений мысли

поч вы проверяли чистый lua 5.х, если в муне luajit 2.1?
 

memir

🇷🇺
Всефорумный модератор
333
597
clock() возвращает процессорное время только на юниксах, для бенчмаркинга на винде юзайте GetProcessTimes() через FFI
 
  • Нравится
Реакции: shinoa и imring