// Online C++ compiler to run C++ program online
#include <iostream>
#include <vector>
#include <chrono>
#include <random>
#include <algorithm>
#include <iomanip>
int main() {
const size_t N = 500'000'0;
std::vector<int> data(N, 1); // Initialize data with N elements, all set to 1
// Create vectors of pointers for sequential and random access
std::vector<int*> seq_ptrs(N);
std::vector<int*> rnd_ptrs(N);
// Initialize pointers for both sequential and random access
for (size_t i = 0; i < N; ++i) {
seq_ptrs[i] = &data[i];
rnd_ptrs[i] = &data[i];
}
// Shuffle the random access pointers
std::shuffle(rnd_ptrs.begin(), rnd_ptrs.end(), std::mt19937{std::random_device{}()});
// Number of iterations
const int iterations = 5;
std::vector<float> seq_times(iterations);
std::vector<float> rnd_times(iterations);
std::vector<float> speedups(iterations);
// Run sequential and random access benchmarks in alternating order
for (int iter = 0; iter < iterations; ++iter) {
// Sequential access benchmark
volatile long double sum_seq = 0;
auto start_seq = std::chrono::high_resolution_clock::now();
for (size_t i = 0; i < N; ++i)
sum_seq += *seq_ptrs[i];
auto end_seq = std::chrono::high_resolution_clock::now();
seq_times[iter] = std::chrono::duration_cast<std::chrono::microseconds>(end_seq - start_seq).count() / 1000.0f;
std::cout << "Seq access (Iteration " << iter + 1 << "): Time = " << std::fixed << std::setprecision(3) << seq_times[iter] << " ms\n";
// Random access benchmark
volatile long double sum_rnd = 0;
auto start_rnd = std::chrono::high_resolution_clock::now();
for (size_t i = 0; i < N; ++i)
sum_rnd += *rnd_ptrs[i];
auto end_rnd = std::chrono::high_resolution_clock::now();
rnd_times[iter] = std::chrono::duration_cast<std::chrono::microseconds>(end_rnd - start_rnd).count() / 1000.0f;
std::cout << "Rnd access (Iteration " << iter + 1 << "): Time = " << std::fixed << std::setprecision(3) << rnd_times[iter] << " ms\n";
// Calculate and print speedup for this iteration
speedups[iter] = rnd_times[iter] / seq_times[iter];
std::cout << "Speedup (Iteration " << iter + 1 << "): 🚀 " << std::fixed << std::setprecision(3) << speedups[iter] << "x\n\n";
}
// Calculate average times and speedup
float avg_seq_time = 0.0f;
float avg_rnd_time = 0.0f;
float avg_speedup = 0.0f;
for (int iter = 0; iter < iterations; ++iter) {
avg_seq_time += seq_times[iter];
avg_rnd_time += rnd_times[iter];
avg_speedup += speedups[iter];
}
avg_seq_time /= iterations;
avg_rnd_time /= iterations;
avg_speedup /= iterations;
// Print average results
std::cout << "\nAverage Seq Access Time: " << std::fixed << std::setprecision(3) << avg_seq_time << " ms\n";
std::cout << "Average Rnd Access Time: " << std::fixed << std::setprecision(3) << avg_rnd_time << " ms\n";
std::cout << "Average Speedup: 🚀 " << std::fixed << std::setprecision(3) << avg_speedup << "x\n";
return 0;
}