Optimise recrw.write
John Smith

John Smith commited on 2023-178 12:30:42
Showing 2 changed files, with 11 additions and 2 deletions.


By replacing a frequently-executed line's string.format with direct
string concatenation, this makes recrw.write faster -- about 30% less
execution time, in my tests.
... ...
@@ -9,15 +9,19 @@ local recrw = dofile(SRC_DIR .. "recrw.lua")
9 9
     load a deck (a table of `Card`s) from a Recfile
10 10
 ]]
11 11
 local function loaddeck(fname, conf)
12
+    local t0 = os.clock()
12 13
     local fh = io.open(fname)
13 14
     if not fh then print("no fh") return nil end
14 15
     local rt = fh:read "a"
15 16
     if not rt then print("no read") return nil end
16 17
     fh:close()
18
+    local t1 = os.clock()
17 19
     local pr = recrw.read(rt)
18 20
     if not pr then print("no recs") return nil end
21
+    local t2 = os.clock()
19 22
     local ep = Card:fromrecs(pr, conf)
20
-    if not ep then print("no cards") return nil end
23
+    local t3 = os.clock()
24
+    print(string.format("times (ms): %.1f load, %.1f recparse, %.1f cardparse", 1000 * (t1 - t0), 1000 * (t2 - t1), 1000 * (t3 - t2)))
21 25
     return ep
22 26
 end
23 27
 
... ...
@@ -26,15 +30,20 @@ end
26 30
 ]]
27 31
 local function savedeck(fname, deck)
28 32
     local rrf = {}
33
+    local t0 = os.clock()
29 34
     for i, cg in ipairs(deck) do
30 35
         rrf[i] = cg:torec()
31 36
     end
37
+    local t1 = os.clock()
32 38
     local wot = recrw.write(rrf)
39
+    local t2 = os.clock()
33 40
     local fh = io.open(fname, "w")
34 41
     if not fh then io.write("couldn't open output\n") end
35 42
     local wr, err = fh:write(wot)
36 43
     if not wr then io.write("couldn't write to output\n") end
37 44
     fh:close()
45
+    local t3 = os.clock()
46
+    print(string.format("times (ms): %.1f recify, %.1f rectext, %.1f write", 1000 * (t1 - t0), 1000 * (t2 - t1), 1000 * (t3 - t2)))
38 47
 end
39 48
 
40 49
 return { load = loaddeck, save = savedeck }
... ...
@@ -94,7 +94,7 @@ local function recs2text(recs, si, ei)
94 94
     if si == ei then
95 95
         for label, vl in pairs(recs[si]) do
96 96
             for j, value in ipairs(vl) do
97
-                ret = ret .. string.format("\n%s: %s", label, tostring(value):gsub("\n", "\n+ "))
97
+                ret = ret .. (label .. ": " .. tostring(value):gsub("\n", "\n+ ") .. "\n")
98 98
             end
99 99
         end
100 100
         return ret .. "\n"
101 101