# Benchmarks

The `bench` directory in the Bril repository contains a fledgling suite of microbenchmarks that you can use to measure the impact of your optimizations. (Benchmarks are different from tests because they are meant to actually calculate something instead of just exercising a language feature.)

The current benchmarks are:

• `ackermann`: Print the value of `Ack(m, n)`, the two-argument Ackermann–Péter function.
• `check-primes`: Check the first n natural numbers for primality, printing out a 1 if the number is prime and a 0 if it’s not.
• `collatz`: Print the Collatz sequence starting at n. Note: it is not known whether this will terminate for all n.
• `digial-root`: Computes the digital root of the input number.
• `eight-queens`: Counts the number of solutions for n queens problem, a generalization of Eight queens puzzle.
• `euclid`: Calculates the greatest common divisor between two large numbers using the Euclidean Algorithm with a helper function for the modulo operator.
• `fib`: Calculate the nth Fibonacci number by allocating and filling an array of numbers up to that point.
• `fizz-buzz`: The infamous programming test.
• `gcd`: Calculate Greatest Common Divisor (GCD) of two input positive integer using Euclidean algorithm.
• `loopfact`: Compute n! imperatively using a loop.
• `mat-mul`: Multiplies two `nxn` matrices using the naive matrix multiplication algorithm. The matrices are randomly generated using a linear congruential generator.
• `newton`: Calculate the square root of 99,999 using the newton method
• `orders`: Compute the order ord(u) for each u in a cyclic group <Zn,+> of integers modulo n under the group operation + (modulo n). Set the second argument is_lcm to true if you would like to compute the orders using the lowest common multiple and otherwise the program will use the greatest common divisor.
• `perfect`: Check if input argument is a perfect number. Returns output as Unix style return code.
• `pythagorean_triple`: Prints all Pythagorean triples with the given c, if such triples exist. An intentionally very naive implementation.
• `quadratic`: The quadratic formula, including a hand-rolled implementation of square root.
• `recfact`: Compute n! using recursive function calls.
• `sieve`: Print all prime numbers up to n using the Sieve of Eratosthenes.
• `sum-bit`: Print the number of 1-bits in the binary representation of the input integer.
• `sum-divisors`: Prints the positive integer divisors of the input integer, followed by the sum of the divisors.
• `sqrt`: Implements the Newton–Raphson Method of approximating the square root of a number to arbitrary precision
• `sum-sq-diff`: Output the difference between the sum of the squares of the first n natural numbers and the square of their sum.
• `binary-fmt`: Print the binary format for the given positive integer.

Credit for several of these benchmarks goes to Alexa VanHattum and Gregory Yauney, who implemented them for their global value numbering project.