// Dos operaciones medidas: se compila con y sin sanitizers para comparar.
#include <cstddef>
#include <cstdio>
#include <numeric>
#include <vector>

#include "bench.h"

long long sum_values(const std::vector<int>& values) {
    long long total = 0;
    for (int value : values) {
        total += value;
    }
    return total;
}

void many_small_blocks(int count) {
    for (int i = 0; i < count; i++) {
        std::vector<int> block(8, i);
        keep(block);
    }
}

int main() {
    std::vector<int> values(1000000);
    std::iota(values.begin(), values.end(), 0);
    double sum_time = median_seconds(9, [&] { keep(sum_values(values)); });
    double block_time = median_seconds(9, [] { many_small_blocks(100000); });
    std::printf("suma de 1000000 enteros: %9.0f us\n", sum_time * 1e6);
    std::printf("100000 bloques pequenos: %9.0f us\n", block_time * 1e6);
    std::printf("bloques / suma:          %9.2f\n", block_time / sum_time);
    return 0;
}
