aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/keeper.cpp4
-rw-r--r--tests/linda_perf.lua161
2 files changed, 90 insertions, 75 deletions
diff --git a/src/keeper.cpp b/src/keeper.cpp
index e7574ed..d99cc50 100644
--- a/src/keeper.cpp
+++ b/src/keeper.cpp
@@ -139,7 +139,9 @@ void KeyUD::peek(KeeperState const K_, int const count_)
139 // read <count_> value off the fifo 139 // read <count_> value off the fifo
140 prepareAccess(K_, -1); // K_: fifo 140 prepareAccess(K_, -1); // K_: fifo
141 int const _at{ lua_gettop(K_) }; 141 int const _at{ lua_gettop(K_) };
142 for (int const _i : std::ranges::iota_view{ 1, std::min(count_, count) }) { // push val2 to valN 142 int const _count{ std::min(count_, count) };
143 STACK_GROW(K_, _count);
144 for (int const _i : std::ranges::iota_view{ 1, _count }) { // push val2 to valN
143 lua_rawgeti(K_, 1, first + _i); // K_: fifo val2..N 145 lua_rawgeti(K_, 1, first + _i); // K_: fifo val2..N
144 } 146 }
145 lua_rawgeti(K_, 1, first); // push val1 // K_: fifo val2..N val1 147 lua_rawgeti(K_, 1, first); // push val1 // K_: fifo val2..N val1
diff --git a/tests/linda_perf.lua b/tests/linda_perf.lua
index b173d12..8fa8242 100644
--- a/tests/linda_perf.lua
+++ b/tests/linda_perf.lua
@@ -18,6 +18,30 @@ local finalizer = function(err, stk)
18end 18end
19 19
20-- ################################################################################################# 20-- #################################################################################################
21if false then
22 do
23 print "############################################ tests get/set"
24 -- linda:get throughput
25 local l = lanes.linda("get/set")
26 local batch = {}
27 for i = 1,1000 do
28 table.insert(batch, i)
29 end
30 for _,size in ipairs{1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987 } do
31 l:set("<->", table_unpack(batch))
32 local count = math.floor(20000000/size)
33 print("START", "get("..size..") " .. count, " times")
34 local t1 = lanes.now_secs()
35 for i = 1, 2000000/math.sqrt(size) do
36 l:get("<->", size)
37 end
38 print("DURATION = " .. lanes.now_secs() - t1 .. "\n")
39 end
40 end
41 collectgarbage()
42end
43
44-- #################################################################################################
21 45
22-- this lane eats items in the linda one by one 46-- this lane eats items in the linda one by one
23local eater = function( l, loop) 47local eater = function( l, loop)
@@ -59,10 +83,10 @@ local lane_gobbler_gen = lanes.gen( "*", {priority = 3}, gobbler)
59-- ################################################################################################# 83-- #################################################################################################
60 84
61-- main thread writes data while a lane reads it 85-- main thread writes data while a lane reads it
62local function ziva( preloop, loop, batch) 86local function ziva1( preloop, loop, batch)
63 -- prefill the linda a bit to increase fifo stress 87 -- prefill the linda a bit to increase fifo stress
64 local top = math.max( preloop, loop) 88 local top = math.max( preloop, loop)
65 local l = lanes.linda() 89 local l = lanes.linda("ziva1("..preloop..":"..loop..":"..batch..")")
66 local t1 = lanes.now_secs() 90 local t1 = lanes.now_secs()
67 for i = 1, preloop do 91 for i = 1, preloop do
68 l:send( "key", i) 92 l:send( "key", i)
@@ -104,60 +128,44 @@ local function ziva( preloop, loop, batch)
104end 128end
105 129
106-- ################################################################################################# 130-- #################################################################################################
107do 131
108 print "############################################ tests get/set" 132if true then
109 -- linda:get throughput 133 do
110 local l = lanes.linda("get/set") 134 TEST1 = TEST1 or 1000
111 local batch = {} 135 PREFILL1 = PREFILL1 or 10000
112 for i = 1,1000 do 136 FILL1 = FILL1 or 2000000
113 table.insert(batch, i) 137
114 end 138 local tests1 =
115 for _,size in ipairs{1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987 } do 139 {
116 l:set("<->", table_unpack(batch)) 140 { PREFILL1, FILL1, 0},
117 local count = 20000000//size 141 { PREFILL1, FILL1, 1},
118 print("START", "get("..size..") " .. count, " times") 142 { PREFILL1, FILL1, 2},
119 local t1 = lanes.now_secs() 143 { PREFILL1, FILL1, 3},
120 for i = 1, 2000000/math.sqrt(size) do 144 { PREFILL1, FILL1, 5},
121 l:get("<->", size) 145 { PREFILL1, FILL1, 8},
146 { PREFILL1, FILL1, 13},
147 { PREFILL1, FILL1, 21},
148 { PREFILL1, FILL1, 34},
149 { PREFILL1, FILL1, 55},
150 { PREFILL1, FILL1, 89},
151 }
152 print "############################################ tests #1"
153 for i, v in ipairs( tests1) do
154 if i > TEST1 then break end
155 local pre, loop, batch = v[1], v[2], v[3]
156 print("-------------------------------------------------\n")
157 print("START", "prefill="..pre, "fill="..loop, "batch="..batch)
158 print("DURATION = " .. ziva1( pre, loop, batch) .. "\n")
122 end 159 end
123 print("DURATION = " .. lanes.now_secs() - t1 .. "\n")
124 end 160 end
125end 161 collectgarbage()
126
127-- #################################################################################################
128
129TEST1 = TEST1 or 1000
130PREFILL1 = PREFILL1 or 10000
131FILL1 = FILL1 or 2000000
132
133local tests1 =
134{
135 { PREFILL1, FILL1, 0},
136 { PREFILL1, FILL1, 1},
137 { PREFILL1, FILL1, 2},
138 { PREFILL1, FILL1, 3},
139 { PREFILL1, FILL1, 5},
140 { PREFILL1, FILL1, 8},
141 { PREFILL1, FILL1, 13},
142 { PREFILL1, FILL1, 21},
143 { PREFILL1, FILL1, 34},
144 { PREFILL1, FILL1, 55},
145 { PREFILL1, FILL1, 89},
146}
147print "############################################ tests #1"
148for i, v in ipairs( tests1) do
149 if i > TEST1 then break end
150 local pre, loop, batch = v[1], v[2], v[3]
151 print("-------------------------------------------------\n")
152 print("START", "prefill="..pre, "fill="..loop, "batch="..batch)
153 print("DURATION = " .. ziva( pre, loop, batch) .. "\n")
154end 162end
155 163
156-- ################################################################################################# 164-- #################################################################################################
157 165
158-- sequential write/read (no parallelization involved) 166-- sequential write/read (no parallelization involved)
159local function ziva2( preloop, loop, batch) 167local function ziva2( preloop, loop, batch)
160 local l = lanes.linda() 168 local l = lanes.linda("ziva2("..preloop..":"..loop..":"..tostring(batch)..")")
161 -- prefill the linda a bit to increase fifo stress 169 -- prefill the linda a bit to increase fifo stress
162 local top, step = math.max( preloop, loop), (l.batched and batch) and batch or 1 170 local top, step = math.max( preloop, loop), (l.batched and batch) and batch or 1
163 local batch_send, batch_read 171 local batch_send, batch_read
@@ -203,32 +211,37 @@ end
203 211
204-- ################################################################################################# 212-- #################################################################################################
205 213
206TEST2 = TEST2 or 1000 214if true then
207PREFILL2 = PREFILL2 or 0 215 do
208FILL2 = FILL2 or 4000000 216 TEST2 = TEST2 or 1000
209 217 PREFILL2 = PREFILL2 or 0
210local tests2 = 218 FILL2 = FILL2 or 4000000
211{ 219
212 { PREFILL2, FILL2}, 220 local tests2 =
213 { PREFILL2, FILL2, 1}, 221 {
214 { PREFILL2, FILL2, 2}, 222 { PREFILL2, FILL2},
215 { PREFILL2, FILL2, 3}, 223 { PREFILL2, FILL2, 1},
216 { PREFILL2, FILL2, 5}, 224 { PREFILL2, FILL2, 2},
217 { PREFILL2, FILL2, 8}, 225 { PREFILL2, FILL2, 3},
218 { PREFILL2, FILL2, 13}, 226 { PREFILL2, FILL2, 5},
219 { PREFILL2, FILL2, 21}, 227 { PREFILL2, FILL2, 8},
220 { PREFILL2, FILL2, 34}, 228 { PREFILL2, FILL2, 13},
221 { PREFILL2, FILL2, 55}, 229 { PREFILL2, FILL2, 21},
222 { PREFILL2, FILL2, 89}, 230 { PREFILL2, FILL2, 34},
223} 231 { PREFILL2, FILL2, 55},
224 232 { PREFILL2, FILL2, 89},
225print "############################################ tests #2" 233 }
226for i, v in ipairs( tests2) do 234
227 if i > TEST2 then break end 235 print "############################################ tests #2"
228 local pre, loop, batch = v[1], v[2], v[3] 236 for i, v in ipairs( tests2) do
229 print("-------------------------------------------------\n") 237 if i > TEST2 then break end
230 print("START", "prefill="..pre, "fill="..loop, "batch="..(batch or "no")) 238 local pre, loop, batch = v[1], v[2], v[3]
231 print("DURATION = " .. ziva2( pre, loop, batch) .. "\n") 239 print("-------------------------------------------------\n")
240 print("START", "prefill="..pre, "fill="..loop, "batch="..(batch or "no"))
241 print("DURATION = " .. ziva2( pre, loop, batch) .. "\n")
242 end
243 end
244 collectgarbage()
232end 245end
233 246
234print "############################################" 247print "############################################"