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 `]]--`