Fuzion Logo
fuzion-lang.dev — The Fuzion Language Portal
JavaScript seems to be disabled. Functionality is limited.

are_we_fast_yet/are_we_fast_yet.fz


# fz -sourceDirs=<this dir> are_we_fast_yet.fz
benchmarks =>

  if envir.args.count != 4
    say "usage:   benchmarks [name] iterations inner_iterations"
    say "example: benchmarks 'name' 10 10"
  else
    name := envir.args.drop(1).first
    iterations := envir.args.drop(2).first.parse_i32.val
    inner_iterations := envir.args.drop(3).first.parse_i32.val

    run_benchmark(b ()->unit) is

      start := time.nano.read
      for i in 1..iterations do
        inner_start := time.nano.read
        for j in 1..inner_iterations do
          b
        say "$name: iterations=1 runtime: {((time.nano.read - inner_start).as_f64 / 1E3).floor}us"
      total := (time.nano.read - start).as_f64 / 1E3

      say "$name: iterations=$iterations average: {(total / iterations.as_f64).floor}us total: {total.floor}us"
      say
      say
      say "Total Runtime: {total.floor}us"

    if name = "Permute"
      run_benchmark (()->_:=permute)
    else if name = "Towers"
      run_benchmark (()->_:=towers)
    else if name = "Storage"
      run_benchmark (()->_:=storage)
    else if name = "Bounce"
      run_benchmark (()->_:=bounce)
    else if name = "List"
      run_benchmark (()->_:=awfy_list)
    else if name = "Mandelbrot"
      run_benchmark (()->_:=mandelbrot)
    else if name = "Queens"
      run_benchmark (()->_:=queens)
    else if name = "Sieve"
      run_benchmark (()->_:=sieve)
    else
      panic "legal names are: Permute, Towers, Storage"

    unit