#include <iostream>
#include <vector>
#include <numeric> // for std::reduce
#include <execution> // for execution policies
#include <chrono> // for timing
void print_duration(const std::string& label, long long ms) {
std::cout << label << ": " << ms << " ms\n";
}
int main() {
const size_t DATA_SIZE = 10'000'000;
std::vector<int> transactions(DATA_SIZE, 1);
std::cout << "Processing " << DATA_SIZE << " transactions...\n";
// 1. Sequential
auto start_seq = std::chrono::high_resolution_clock::now();
long long sum_seq = std::reduce(std::execution::seq, transactions.begin(), transactions.end());
auto end_seq = std::chrono::high_resolution_clock::now();
auto dur_seq = std::chrono::duration_cast<std::chrono::milliseconds>(end_seq - start_seq).count();
std::cout << "Sum (Seq): " << sum_seq << " | ";
print_duration("Sequential", dur_seq);
// 2. Parallel
auto start_par = std::chrono::high_resolution_clock::now();
long long sum_par = std::reduce(std::execution::par, transactions.begin(), transactions.end());
auto end_par = std::chrono::high_resolution_clock::now();
auto dur_par = std::chrono::duration_cast<std::chrono::milliseconds>(end_par - start_par).count();
std::cout << "Sum (Par): " << sum_par << " | ";
print_duration("Parallel", dur_par);
// 3. Parallel Unsequenced
auto start_unseq = std::chrono::high_resolution_clock::now();
long long sum_unseq = std::reduce(std::execution::par_unseq, transactions.begin(), transactions.end());
auto end_unseq = std::chrono::high_resolution_clock::now();
auto dur_unseq = std::chrono::duration_cast<std::chrono::milliseconds>(end_unseq - start_unseq).count();
std::cout << "Sum (Unseq): " << sum_unseq << " | ";
print_duration("Parallel Unseq", dur_unseq);
return 0;
}