summaryrefslogtreecommitdiff
path: root/Data/BuiltIn/Libraries/LiteJson/bench/bench_decode.lua
blob: 6c2e93aae7db3e85013e234f993d82ee5a38ed16 (plain)
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
local bench = require "util.bench"


local libs = {
  "../json.lua",    -- https://github.com/rxi/json.lua
  "dkjson.lua",     -- https://github.com/LuaDist/dkjson
  "jfjson.lua",     -- http://regex.info/blog/lua/json
  --"json4lua.lua",   -- https://github.com/craigmj/json4lua
}


-- JSON string: wikipedia example stored 1000 times in an array
local text = "[" .. string.rep([[{
  "firstName": "John",
  "lastName": "Smith",
  "isAlive": true,
  "age": 25,
  "address": {
    "streetAddress": "21 2nd Street",
    "city": "New York",
    "state": "NY",
    "postalCode": "10021-3100"
  },
  "phoneNumbers": [
    {
      "type": "home",
      "number": "212 555-1234"
    },
    {
      "type": "office",
      "number": "646 555-4567"
    }
  ],
  "children": [],
  "spouse": null
}, ]], 1000):sub(1, -3) .. "]"


-- As this is meant to be a pure Lua benchmark, we remove the ability to
-- require 'lpeg' so dkjson doesn't use it for parsing. (Incidentally json.lua
-- seems to outperform libraries which use lpeg when both are using LuaJIT)
local _require = require
require = function(modname)
  if modname == "lpeg" then error() end
  return _require(modname)
end

-- Run benchmarks, store results
local results = {}

for i, name in ipairs(libs) do
  local f = loadfile(name)
  if not f then 
    error( "failed to load '" .. name ..  "'; run './get_json_libs.sh'" )
  end
  local json = f()

  -- Remap functions to work for jfjson.lua
  if name == "jfjson.lua" then
    local _encode, _decode = json.encode, json.decode
    json.encode = function(...) return _encode(json, ...) end
    json.decode = function(...) return _decode(json, ...) end
  end

  -- Warmup (for LuaJIT)
  bench.run(name, 1, function() json.decode(text) end)

  -- Run and push results
  local res = bench.run(name, 10, function() json.decode(text) end)
  table.insert(results, res)
end


bench.print_system_info()
bench.print_results(results)