{}
run-icon
main.cpp
// 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; }
Output