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