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