xref: /xnu-8792.61.2/tests/vm/perf_madvise.lua (revision 42e220869062b56f8d7d0726fd4c88954f87902c)
1#!/usr/local/bin/recon
2
3local benchrun = require 'benchrun'
4local perfdata = require 'perfdata'
5local csv = require 'csv'
6
7require 'strict'
8
9local kDefaultDuration = 15
10local kDefaultSizeMb = 16
11
12local benchmark = benchrun.new {
13    name = 'xnu.madvise',
14    version = 1,
15    arg = arg,
16    modify_argparser = function(parser)
17        parser:argument {
18          name = 'path',
19          description = 'Path to perf_madvise binary'
20        }
21        parser:option{
22          name = '--duration',
23          description = 'How long, in seconds, to run each iteration',
24          default = kDefaultDuration
25        }
26        parser:option{
27            name = '--variant',
28            description = 'Which benchmark variant to run (MADV_FREE)',
29            default = 'MADV_FREE',
30            choices = {"MADV_FREE"}
31        }
32        parser:option{
33            name = '--verbose',
34            description = 'Enable verbose logging',
35        }
36        parser:option{
37            name = '--size',
38            description = 'Madvise buffer size (MB)',
39            default = kDefaultSizeMb
40        }
41    end
42}
43
44local unit = perfdata.unit.custom('pages/sec')
45local tests = {
46    path = benchmark.opt.path,
47}
48
49local args = {benchmark.opt.path, benchmark.opt.variant, benchmark.opt.duration, benchmark.opt.size}
50if benchmark.opt.verbose then
51    table.insert(args, "-v")
52end
53args.echo = true
54for out in benchmark:run(args) do
55    local result = out:match("-----Results-----\n(.*)")
56    benchmark:assert(result, "Unable to find result data in output")
57    local data = csv.openstring(result, {header = true})
58    for field in data:lines() do
59        for k, v in pairs(field) do
60            benchmark.writer:add_value(k, unit, tonumber(v), {
61              [perfdata.larger_better] = true,
62              variant = benchmark.opt.variant
63            })
64        end
65    end
66end
67benchmark.writer:set_primary_metric("Throughput (bytes / CPU second)")
68
69benchmark:finish()
70