-
Notifications
You must be signed in to change notification settings - Fork 0
/
instructions_cost.lua
201 lines (180 loc) · 6.11 KB
/
instructions_cost.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
local TEST_ITERATIONS = 100
--- TFM Settings
tfm.exec.disableAutoNewGame(true)
math.randomseed(42)
--- Resources available for tests
local f = function() end
local f_r = function() return 18 end
local f_1 = function(a) end
local f_4 = function(a,b,c,d) end
local dst_l = 1
dst_g = 1
local a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
local t = {a = 0, b = 1, c = 2, d = 3, e = 4, f = 5, g = 6, h = 7, i = 8, j = 9}
local random = math.random
local s
--- Tests.
-- For better accuracy, each test is performed 1000 times, including 100 using a loop.
local tests = {
{name = "witness", func = function()
for i = 1,100 do
-- expect 10 instructions
end
end},
{name = "function call", func = function()
for i = 1,100 do
f()f()f()f()f()f()f()f()f()f()
end
end},
{name = "function call 1 arg", func = function()
for i = 1,100 do
f_1(0)f_1(1)f_1(2)f_1(3)f_1(4)f_1(5)f_1(6)f_1(7)f_1(8)f_1(9)
end
end},
{name = "function call 4 args", func = function()
for i = 1,100 do
f_4(0,1,2,3)f_4(1,1,2,3)f_4(2,1,2,3)f_4(3,1,2,3)f_4(4,1,2,3)f_4(5,1,2,3)f_4(6,1,2,3)f_4(7,1,2,3)f_4(8,1,2,3)f_4(9,1,2,3)
end
end},
{name = "function call return", func = function()
for i = 1,100 do
f_r()f_r()f_r()f_r()f_r()f_r()f_r()f_r()f_r()f_r()
end
end},
{name = "tonumber('NNNN')", func = function()
for i = 1,100 do
tonumber("8789")tonumber("4555")tonumber("1234")tonumber("2341")tonumber("8789")tonumber("9908")tonumber("8769")tonumber("3567")tonumber("5555")tonumber("6555")
end
end},
{name = "tostring(NNNN)", func = function()
for i = 1,100 do
tostring(1873)tostring(5665)tostring(4123)tostring(8756)tostring(4758)tostring(4444)tostring(5544)tostring(4452)tostring(5525)tostring(4485)
end
end},
{name = "math.random()", func = function()
for i = 1,100 do
random()random()random()random()random()random()random()random()random()random()
end
end},
{name = "read local", func = function()
for i = 1,100 do
if dst_l and dst_l and dst_l and dst_l and dst_l and dst_l and dst_l and dst_l and dst_l and dst_l then end
end
end},
{name = "read global", func = function()
for i = 1,100 do
if dst_g and dst_g and dst_g and dst_g and dst_g and dst_g and dst_g and dst_g and dst_g and dst_g then end
end
end},
{name = "assign local", func = function()
for i = 1,100 do
dst_l = 0 dst_l = 1 dst_l = 2 dst_l = 3 dst_l = 4 dst_l = 5 dst_l = 6 dst_l = 7 dst_l = 8 dst_l = 9
end
end},
{name = "assign global", func = function()
for i = 1,100 do
dst_g = 0 dst_g = 1 dst_g = 2 dst_g = 3 dst_g = 4 dst_g = 5 dst_g = 6 dst_g = 7 dst_g = 8 dst_g = 9
end
end},
{name = "read array entry", func = function()
for i = 1,100 do
if a[0] and a[9] and a[2] and a[3] and a[4] and a[5] and a[7] and a[6] and a[8] and a[1] then end
end
end},
{name = "assign array entry", func = function()
for i = 1,100 do
a[9] = 0 a[1] = 1 a[8] = 2 a[3] = 3 a[5] = 4 a[4] = 5 a[6] = 6 a[7] = 7 a[2] = 8 a[0] = 9
end
end},
{name = "read table entry", func = function()
for i = 1,100 do
if t.a and t.b and t.c and t.b and t.e and t.f and t.g and t.h and t.i and t.j then end
end
end},
{name = "assign table entry", func = function()
for i = 1,100 do
t.a = 0 t.b = 1 t.c = 2 t.d = 3 t.e = 4 t.f = 5 t.g = 6 t.h = 7 t.i = 8 t.j = 9
end
end},
{name = "assign #10 string", func = function()
for i = 1,100 do
s = "HelloWorld" s = "HelloWorld" s = "HelloWorld" s = "HelloWorld" s = "HelloWorld" s = "HelloWorld" s = "HelloWorld" s = "HelloWorld" s = "HelloWorld" s = "HelloWorld"
end
end},
{name = "assign #20 string", func = function()
for i = 1,100 do
s = "Hello Very Big World" s = "Hello Very Big World" s = "Hello Very Big World" s = "Hello Very Big World" s = "Hello Very Big World" s = "Hello Very Big World" s = "Hello Very Big World" s = "Hello Very Big World" s = "Hello Very Big World" s = "Hello Very Big World"
end
end},
{name = "'ABCD' .. 'EFGH'", func = function()
for i = 1,100 do
if 'ABCD' .. 'EFGH' and 'ABCD' .. 'EFGH' and 'ABCD' .. 'EFGH' and 'ABCD' .. 'EFGH' and 'ABCD' .. 'EFGH' and 'ABCD' .. 'EFGH' and 'ABCD' .. 'EFGH' and 'ABCD' .. 'EFGH' and 'ABCD' .. 'EFGH' and 'ABCD' .. 'EFGH' then end
end
end},
{name = "for ipairs(#10 array)", func = function()
for i = 1,100 do
for i,v in ipairs(a) do end
end
end},
{name = "for pairs(#10 array)", func = function()
for i = 1,100 do
for i,v in pairs(a) do end
end
end},
{name = "for pairs(#10 table)", func = function()
for i = 1,100 do
for i,v in pairs(t) do end
end
end},
}
--- Total tile taken by each test.
local total_times = {}
for i_test, test in ipairs(tests) do
total_times[test.name] = 0
end
--- Run all the tests once
local test_run_count = 0
local os_time = os.time
local function RunTests()
for i_test, test in ipairs(tests) do
local start_time, end_time
local func = test.func
start_time = os_time()
func()
end_time = os_time()
total_times[test.name] = total_times[test.name] + (end_time - start_time)
end
test_run_count = test_run_count + 1
tfm.exec.chatMessage(string.format("Tests <fc>%d%%</fc> complete.", test_run_count * 100 / TEST_ITERATIONS))
end
--- Display test results
local function DisplayResults()
tfm.exec.chatMessage(string.format("<fc>Tests done!</fc> (<r>%d</r> iterations, <r>1000</r> instructions per iteration)", test_run_count))
local witness_time = total_times["witness"]
for i_test, test in ipairs(tests) do
local time = total_times[test.name]
-- substracting witness time from tests
if test_name ~= "witness" then
total_times[test.name] = time - witness_time
end
local padding = ""
for i = #test.name-(#test.name+3)%4,20,4 do
padding = padding .. "\t"
end
tfm.exec.chatMessage(string.format("> <ch>%s</ch>:%s<r>%dms</r> ttl -\t<ch2>%.6fms</ch2>/1000i", test.name, padding, time, time / test_run_count))
end
end
--- Run tests every 5 loops so we dont run out of runtime.
local i_loop = -1
local results_displayed = false
function eventLoop()
if test_run_count < TEST_ITERATIONS then
i_loop = (i_loop + 1) % 5
if i_loop == 0 then
RunTests()
end
elseif test_run_count == TEST_ITERATIONS and not results_displayed then
DisplayResults()
results_displayed = true
end
end