>>106497988
and the corrections to main is this
template <class T>
__attribute__((always_inline)) inline void do_not_optimize(const T &value) {
asm volatile("" : "+m"(const_cast<T &>(value)));
}
int main()
{
using namespace std::chrono;
const size_t test_arr_size { 50000 };
int test_arr[test_arr_size];
for (size_t i = 0; i < test_arr_size; ++i)
{
test_arr[i] = rand();
}
randomize_cache();
const auto test_arr_ptr { reinterpret_cast<int *>(test_arr) };
const auto slow_start { high_resolution_clock::now() };
do_not_optimize(test_arr_ptr);
const auto slow_result { slow(test_arr_ptr, test_arr_size) };
do_not_optimize(slow_result);
const auto slow_stop { high_resolution_clock::now() };
randomize_cache();
const auto fast_start { high_resolution_clock::now() };
do_not_optimize(test_arr_ptr);
const auto fast_result { fast(test_arr_ptr, test_arr_size) };
do_not_optimize(fast_result);
const auto fast_stop { high_resolution_clock::now() };
randomize_cache();
const auto slow_with_std_reduce_start { high_resolution_clock::now() };
do_not_optimize(test_arr_ptr);
const auto slow_with_std_reduce_result { slow_with_std_reduce(test_arr_ptr, test_arr_size) };
do_not_optimize(slow_with_std_reduce_result);
const auto slow_with_std_reduce_stop { high_resolution_clock::now() };