View difference between Paste ID: wfM7cXtU and nWC9sNex
SHOW: | | - or go back to the newest paste.
1
function test_tableremove(mylist)
2
    for i=#mylist,1,-1 do
3
        if mylist[i] == 13 then
4
            table.remove(mylist, i)
5
        end
6
    end
7
end -- func
8
 
9
function test_mitch(mylist)
10
    -- NOTE: This is a messy, hardcoded version of my algorithm, for test-purposes.
11
    -- Go to https://stackoverflow.com/a/53038524/8874388 for the actual, clean version.
12
    local j, n = 1, #mylist;
13
 
14
    for i=1,n do
15
        local value = mylist[i]
16
        if value ~= 13 then -- Keep everything except "13"
17
            -- Move i's kept value to j's position, if it's not already there.
18
            if (i ~= j) then
19
                mylist[j] = mylist[i];
20
                mylist[i] = nil;
21
            end
22
            j = j + 1; -- Increment position of where we'll place the next kept value.
23
        else -- Delete "13"
24
            mylist[i] = nil;
25
        end
26
    end
27
end
28
 
29
function build_tables(howMany)
30
    local ofs = {}
31
    for i=1,howMany do
32
        ofs[i*50] = true;
33
    end
34
35
    local tables = {}
36
    for i=1, 1 do
37
      tables[i] = {}
38
      for j=1, 2000000 do -- 2 million items
39
        tables[i][j] = (ofs[j] and 13 or 100) -- put a "13" (deleted) in the slots to be deleted, otherwise "100" (kept)
40
      end
41
    end
42
 
43
    return tables
44
end
45
 
46
function time_func(func, name, howMany)
47
    local tables = build_tables(howMany)
48
    time0 = os.clock()
49
    for i=1, #tables do
50
        func(tables[i])
51
    end
52
    time1 = os.clock()
53
    print(string.format("[%13s] elapsed time (deleting %.0f items): %.3f\n", name, howMany, time1 - time0))
54
end
55
 
56
-- The number below (i) controls how many items that will need to be deleted from the array.
57
-- This test checks if table.remove() is ever faster if you only need to remove a few entries.
58
-- The test arrays contain 2 million items, and the items that need to be removed at all at the start,
59
-- hence triggering the need to re-index the subsequent array entries.
60
for i=1,6 do
61
    time_func(test_mitch, "mitch", i)
62
    time_func(test_tableremove, "table.remove", i)
63
end
64
65
66
--[[
67
68
LuaJIT 2.0.5 -- Copyright (C) 2005-2017 Mike Pall. http://luajit.org/
69
JIT: ON CMOV SSE2 SSE3 SSE4.1 fold cse dce fwd dse narrow loop abc sink fuse
70
71-
[        mitch] elapsed time (deleting 1 items): 0.011
71+
[        mitch] elapsed time (deleting 1 items): 0.008
72
73-
[ table.remove] elapsed time (deleting 1 items): 0.011
73+
[ table.remove] elapsed time (deleting 1 items): 0.010
74
75-
[        mitch] elapsed time (deleting 2 items): 0.009
75+
[        mitch] elapsed time (deleting 2 items): 0.008
76
77-
[ table.remove] elapsed time (deleting 2 items): 0.014
77+
[ table.remove] elapsed time (deleting 2 items): 0.019
78
79
[        mitch] elapsed time (deleting 3 items): 0.008
80
81
[ table.remove] elapsed time (deleting 3 items): 0.022
82
83-
[        mitch] elapsed time (deleting 4 items): 0.010
83+
[        mitch] elapsed time (deleting 4 items): 0.008
84
85
[ table.remove] elapsed time (deleting 4 items): 0.028
86
87
[        mitch] elapsed time (deleting 5 items): 0.008
88
89
[ table.remove] elapsed time (deleting 5 items): 0.031
90
91
[        mitch] elapsed time (deleting 6 items): 0.008
92
93
[ table.remove] elapsed time (deleting 6 items): 0.039
94
95
96
97
Lua 5.3.4  Copyright (C) 1994-2017 Lua.org, PUC-Rio
98
99
+ $ lua test.lua
100
[        mitch] elapsed time (deleting 1 items): 0.306
101
102
[ table.remove] elapsed time (deleting 1 items): 0.121
103
104
[        mitch] elapsed time (deleting 2 items): 0.309
105
106
[ table.remove] elapsed time (deleting 2 items): 0.164
107
108
[        mitch] elapsed time (deleting 3 items): 0.313
109
110
[ table.remove] elapsed time (deleting 3 items): 0.237
111
112
[        mitch] elapsed time (deleting 4 items): 0.326
113
114
[ table.remove] elapsed time (deleting 4 items): 0.262
115
116
[        mitch] elapsed time (deleting 5 items): 0.326
117
118
[ table.remove] elapsed time (deleting 5 items): 0.304
119
120
[        mitch] elapsed time (deleting 6 items): 0.334
121
122
[ table.remove] elapsed time (deleting 6 items): 0.341
123
124
125
126
]]--