public class Benchmark {
public static int fibonacci(int n) {
if (n <= 1) {
return n;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
public static int fibonacciIterative(int n) {
if (n <= 1) {
return n;
}
int a = 0;
int b = 1;
for (int i = 2; i <= n; i++) {
int temp = a + b;
a = b;
b = temp;
}
return b;
}
public static int countPrimes(int limit) {
int count = 0;
for (int n = 2; n <= limit; n++) {
boolean isPrime = true;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
count++;
}
}
return count;
}
public static long sumLoop(int iterations) {
long sum = 0L;
for (int i = 0; i < iterations; i++) {
sum = sum + i;
}
return sum;
}
public static int arraySum(int size) {
int[] arr = new int[size];
for (int i = 0; i < size; i++) {
arr[i] = i;
}
int sum = 0;
for (int ii = 0; ii < size; ii++) {
sum = sum + arr[ii];
}
return sum;
}
public static int arrayReverse(int size) {
int[] arr = new int[size];
for (int i = 0; i < size; i++) {
arr[i] = i;
}
for (int ii = 0; ii < size / 2; ii++) {
int temp = arr[ii];
arr[ii] = arr[size - 1 - ii];
arr[size - 1 - ii] = temp;
}
return arr[0];
}
public static int nestedLoops(int n) {
int sum = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
sum = sum + i + j;
}
}
return sum;
}
public static int factorial(int n) {
if (n <= 1) {
return 1;
}
return n * factorial(n - 1);
}
public static int ackermann(int m, int n) {
if (m == 0) {
return n + 1;
}
if (n == 0) {
return ackermann(m - 1, 1);
}
return ackermann(m - 1, ackermann(m, n - 1));
}
public static int identity(int x) {
return x;
}
public static int methodCallOverhead(int iterations) {
int sum = 0;
for (int i = 0; i < iterations; i++) {
sum = sum + identity(i);
}
return sum;
}
public static long arithmeticOps(int iterations) {
long result = 0L;
for (int i = 1; i < iterations; i++) {
result = result + i * 2 - i / 2 + i % 7;
}
return result;
}
public static int conditionalBranching(int iterations) {
int sum = 0;
for (int i = 0; i < iterations; i++) {
if (i % 2 == 0) {
sum = sum + i;
} else {
sum = sum - i;
}
}
return sum;
}
public static int complexConditions(int iterations) {
int count = 0;
for (int i = 0; i < iterations; i++) {
if (i % 3 == 0 && i % 5 == 0) {
count = count + 1;
} else if (i % 3 == 0) {
count = count + 2;
} else if (i % 5 == 0) {
count = count + 3;
}
}
return count;
}
public static int matrixMultiply(int size) {
int[][] a = new int[size][size];
int[][] b = new int[size][size];
int[][] c = new int[size][size];
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
a[i][j] = i + j;
b[i][j] = i - j;
}
}
for (int ii = 0; ii < size; ii++) {
for (int jj = 0; jj < size; jj++) {
int sum = 0;
for (int kk = 0; kk < size; kk++) {
sum = sum + a[ii][kk] * b[kk][jj];
}
c[ii][jj] = sum;
}
}
return c[0][0];
}
public static int bubbleSort(int size) {
int[] arr = new int[size];
for (int i = 0; i < size; i++) {
arr[i] = size - i;
}
for (int ii = 0; ii < size - 1; ii++) {
for (int jj = 0; jj < size - ii - 1; jj++) {
if (arr[jj] > arr[jj + 1]) {
int temp = arr[jj];
arr[jj] = arr[jj + 1];
arr[jj + 1] = temp;
}
}
}
return arr[0];
}
public static int main() {
System.out.println("=== Rava Comprehensive Benchmark Suite ===");
long start = System.nanoTime();
int fib30 = fibonacci(30);
long end = System.nanoTime();
long fibTime = (end - start) / 1000000;
System.out.print("Fibonacci(30) recursive = ");
System.out.println(fib30);
System.out.print("Time: ");
System.out.print(fibTime);
System.out.println(" ms");
start = System.nanoTime();
int fib40iter = fibonacciIterative(40);
end = System.nanoTime();
long fibIterTime = (end - start) / 1000000;
System.out.print("Fibonacci(40) iterative = ");
System.out.println(fib40iter);
System.out.print("Time: ");
System.out.print(fibIterTime);
System.out.println(" ms");
start = System.nanoTime();
int primes = countPrimes(100000);
end = System.nanoTime();
long primeTime = (end - start) / 1000000;
System.out.print("Primes up to 100000 = ");
System.out.println(primes);
System.out.print("Time: ");
System.out.print(primeTime);
System.out.println(" ms");
start = System.nanoTime();
long sumResult = sumLoop(10000000);
end = System.nanoTime();
long sumTime = (end - start) / 1000000;
System.out.print("Sum 0..10000000 = ");
System.out.println(sumResult);
System.out.print("Time: ");
System.out.print(sumTime);
System.out.println(" ms");
start = System.nanoTime();
int arrSum = arraySum(1000000);
end = System.nanoTime();
long arrSumTime = (end - start) / 1000000;
System.out.print("Array sum (1M elements) = ");
System.out.println(arrSum);
System.out.print("Time: ");
System.out.print(arrSumTime);
System.out.println(" ms");
start = System.nanoTime();
int arrRev = arrayReverse(1000000);
end = System.nanoTime();
long arrRevTime = (end - start) / 1000000;
System.out.print("Array reverse (1M elements) = ");
System.out.println(arrRev);
System.out.print("Time: ");
System.out.print(arrRevTime);
System.out.println(" ms");
start = System.nanoTime();
int nested = nestedLoops(1000);
end = System.nanoTime();
long nestedTime = (end - start) / 1000000;
System.out.print("Nested loops (1000x1000) = ");
System.out.println(nested);
System.out.print("Time: ");
System.out.print(nestedTime);
System.out.println(" ms");
start = System.nanoTime();
int fact = factorial(15);
end = System.nanoTime();
long factTime = (end - start) / 1000000;
System.out.print("Factorial(15) recursive = ");
System.out.println(fact);
System.out.print("Time: ");
System.out.print(factTime);
System.out.println(" ms");
start = System.nanoTime();
int ack = ackermann(3, 6);
end = System.nanoTime();
long ackTime = (end - start) / 1000000;
System.out.print("Ackermann(3, 6) = ");
System.out.println(ack);
System.out.print("Time: ");
System.out.print(ackTime);
System.out.println(" ms");
start = System.nanoTime();
int methodCall = methodCallOverhead(10000000);
end = System.nanoTime();
long methodCallTime = (end - start) / 1000000;
System.out.print("Method calls (10M) = ");
System.out.println(methodCall);
System.out.print("Time: ");
System.out.print(methodCallTime);
System.out.println(" ms");
start = System.nanoTime();
long arith = arithmeticOps(10000000);
end = System.nanoTime();
long arithTime = (end - start) / 1000000;
System.out.print("Arithmetic ops (10M) = ");
System.out.println(arith);
System.out.print("Time: ");
System.out.print(arithTime);
System.out.println(" ms");
start = System.nanoTime();
int cond = conditionalBranching(10000000);
end = System.nanoTime();
long condTime = (end - start) / 1000000;
System.out.print("Conditional branches (10M) = ");
System.out.println(cond);
System.out.print("Time: ");
System.out.print(condTime);
System.out.println(" ms");
start = System.nanoTime();
int complex = complexConditions(10000000);
end = System.nanoTime();
long complexTime = (end - start) / 1000000;
System.out.print("Complex conditions (10M) = ");
System.out.println(complex);
System.out.print("Time: ");
System.out.print(complexTime);
System.out.println(" ms");
start = System.nanoTime();
int matrix = matrixMultiply(50);
end = System.nanoTime();
long matrixTime = (end - start) / 1000000;
System.out.print("Matrix multiply (50x50) = ");
System.out.println(matrix);
System.out.print("Time: ");
System.out.print(matrixTime);
System.out.println(" ms");
start = System.nanoTime();
int bubble = bubbleSort(5000);
end = System.nanoTime();
long bubbleTime = (end - start) / 1000000;
System.out.print("Bubble sort (5000 elements) = ");
System.out.println(bubble);
System.out.print("Time: ");
System.out.print(bubbleTime);
System.out.println(" ms");
System.out.println("=== Benchmark Complete ===");
return 0;
}
}