Created
May 7, 2022 16:11
-
-
Save nthery/523890ac88f5bb8828eac66a7de903a4 to your computer and use it in GitHub Desktop.
Word counter implemented with transform_reduce()
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Word counter implemented with transform_reduce() | |
// Stolen from https://www.youtube.com/watch?v=LW_T2RGXego&t=571s | |
#include <iterator> | |
#include <functional> | |
#include <cctype> | |
#include <iostream> | |
#include <numeric> | |
#include <execution> | |
#if 1 | |
static const char words[] = "Le Lorem Ipsum est simplement du faux texte employé dans la composition et la mise en page avant impression. Le Lorem Ipsum est le faux texte standard de l'imprimerie depuis les années 1500, quand un imprimeur anonyme assembla ensemble des morceaux de texte pour réaliser un livre spécimen de polices de texte. Il n'a pas fait que survivre cinq siècles, mais s'est aussi adapté à la bureautique informatique, sans que son contenu n'en soit modifié. Il a été popularisé dans les années 1960 grâce à la vente de feuilles Letraset contenant des passages du Lorem Ipsum, et, plus récemment, par son inclusion dans des applications de mise en page de texte, comme Aldus PageMaker."; | |
#else | |
static const char words[] = " Le Lorem Ipsum"; | |
#endif | |
template<typename ExecutionPolicy> | |
int count(ExecutionPolicy policy) { | |
auto n = std::transform_reduce( | |
policy, | |
std::begin(words), std::end(words)-1, | |
std::begin(words) + 1, | |
!std::isspace(words[0]) ? 1 : 0, | |
std::plus{}, | |
[](auto l, auto r) { return std::isspace(l) && !std::isspace(r) ? 1 : 0; }); | |
return n; | |
} | |
static void Sequential(benchmark::State& state) { | |
for (auto _ : state) { | |
benchmark::DoNotOptimize(count(std::execution::seq)); | |
} | |
} | |
BENCHMARK(Sequential); | |
static void Simd(benchmark::State& state) { | |
for (auto _ : state) { | |
benchmark::DoNotOptimize(count(std::execution::unseq)); | |
} | |
} | |
BENCHMARK(Simd); | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment