diff --git a/cmd/tools/fast/fast.v b/cmd/tools/fast/fast.v index 48df2a0b5c..b935a08c05 100644 --- a/cmd/tools/fast/fast.v +++ b/cmd/tools/fast/fast.v @@ -3,91 +3,115 @@ // that can be found in the LICENSE file. import os import time +import arrays + +const warmup_samples = 2 + +const max_samples = 10 + +const discard_highest_samples = 6 const voptions = ' -skip-unused -show-timings -stats ' -const exe = os.executable() +const fast_dir = os.dir(@FILE) -const fast_dir = os.dir(exe) +const vdir = os.dir(os.dir(os.dir(fast_dir))) -const vdir = @VEXEROOT +fn elog(msg string) { + eprintln('$time.now().format_ss_micro() $msg') +} fn main() { - dump(fast_dir) - dump(vdir) + total_sw := time.new_stopwatch() + elog('fast.html generator start') + defer { + elog('fast.html generator end, total: ${total_sw.elapsed().milliseconds():6} ms') + } + // + mut ccompiler_path := 'tcc' + if vdir.contains('/tmp/cirrus-ci-build') { + ccompiler_path = 'clang' + } + if os.args.contains('-clang') { + ccompiler_path = 'clang' + } + elog('fast_dir: $fast_dir | vdir: $vdir | compiler: $ccompiler_path') + os.chdir(fast_dir)! if !os.exists('$vdir/v') && !os.is_dir('$vdir/vlib') { - println('fast.html generator needs to be located in `v/cmd/tools/fast`') + elog('fast.html generator needs to be located in `v/cmd/tools/fast`') + exit(1) } - println('fast.html generator\n') + if !os.exists('table.html') { + os.create('table.html')! + } + if !os.args.contains('-noupdate') { - println('Fetching updates...') + elog('Fetching updates...') ret := os.system('$vdir/v up') if ret != 0 { - println('failed to update V') + elog('failed to update V, exit_code: $ret') return } } // fetch the last commit's hash commit := exec('git rev-parse HEAD')[..8] - if !os.exists('table.html') { - os.create('table.html')! - } - mut table := os.read_file('table.html')! if os.exists('website/index.html') { uploaded_index := os.read_file('website/index.html')! if uploaded_index.contains('>$commit<') { - println('nothing to benchmark') - exit(1) - return + elog('NOTE: commit $commit had been benchmarked already.') + if !os.args.contains('-force') { + elog('nothing more to do') + return + } } } + + os.chdir(vdir)! message := exec('git log --pretty=format:"%s" -n1 $commit') - println('\nBenchmarking commit $commit "$message"') + commit_date := exec('git log -n1 --pretty="format:%at" $commit') + date := time.unix(commit_date.i64()) + + elog('Benchmarking commit $commit , with commit message: "$message", commit_date: $commit_date, date: $date') // build an optimized V - println(' Building vprod...') - os.chdir(vdir)! - if os.args.contains('-noprod') { - exec('./v -o vprod cmd/v') // for faster debugging + if os.args.contains('-do-not-rebuild-vprod') { + if !os.exists('vprod') { + elog('Exiting, since if you use `-do-not-rebuild-vprod`, you should already have a `$vdir/vprod` executable, but it is missing!') + return + } } else { - exec('./v -o vprod -prod -prealloc cmd/v') + elog(' Building vprod...') + if os.args.contains('-noprod') { + exec('./v -o vprod cmd/v') // for faster debugging + } else { + exec('./v -o vprod -prod -prealloc cmd/v') + } } - // cache vlib modules - exec('$vdir/v wipe-cache') - exec('$vdir/v -o v2 -prod cmd/v') + if !os.args.contains('-do-not-rebuild-caches') { + elog('clearing caches...') + // cache vlib modules + exec('$vdir/v wipe-cache') + exec('$vdir/v -o vwarm_caches -cc $ccompiler_path cmd/v') + } // measure diff1 := measure('$vdir/vprod $voptions -o v.c cmd/v', 'v.c') - mut tcc_path := 'tcc' - $if freebsd { - tcc_path = '/usr/local/bin/tcc' - if vdir.contains('/tmp/cirrus-ci-build') { - tcc_path = 'clang' - } - } - if os.args.contains('-clang') { - tcc_path = 'clang' - } - - diff2 := measure('$vdir/vprod $voptions -cc $tcc_path -o v2 cmd/v', 'v2') + diff2 := measure('$vdir/vprod $voptions -cc $ccompiler_path -o v2 cmd/v', 'v2') diff3 := 0 // measure('$vdir/vprod -native $vdir/cmd/tools/1mil.v', 'native 1mil') - diff4 := measure('$vdir/vprod -usecache $voptions -cc clang examples/hello_world.v', + diff4 := measure('$vdir/vprod $voptions -cc $ccompiler_path -usecache examples/hello_world.v', 'hello.v') vc_size := os.file_size('v.c') / 1000 - scan, parse, check, cgen, vlines := measure_steps(vdir) + scan, parse, check, cgen, vlines := measure_steps_minimal(vdir)! - commit_date := exec('git log -n1 --pretty="format:%at" $commit') - date := time.unix(commit_date.int()) + html_message := message.replace_each(['<', '<', '>', '>']) os.chdir(fast_dir)! - mut out := os.create('table.html')! - // place the new row on top - html_message := message.replace_each(['<', '<', '>', '>']) - table = + table := os.read_file('table.html')! + new_table := '