diff --git a/stat_date.cpp b/stat_date.cpp index 4ee2f20..dddf105 100644 --- a/stat_date.cpp +++ b/stat_date.cpp @@ -1,8 +1,16 @@ +#include #include +#include #include #include #include "defs.hpp" +template using vec = std::vector; +using dmap = std::map; +using smap = std::map; +using pss = std::pair; +using pvec = vec; + const std::regex date_match[] = { // YYYY MM DD std::regex(R"((?:19|20)\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[1-2][0-9]|3[0-1]))"), @@ -34,22 +42,44 @@ const std::regex date_match[] = { void stat_date(const DataSource &source) { timeit(fmt::format("stat_date({})", magic_enum::enum_name(source))); - std::map date_map; - std::map type_map; + // 35s + vec passwords_vec; + vec partial; + dmap date_map; + smap type_map; - for (auto const &password : passwords(source)) { + auto eval = [](auto const &str) { + vec ret; for (int i = 0; i < sizeof(date_match) / sizeof(date_match[0]); i++) { const auto &match = date_match[i]; - auto bgn = std::sregex_iterator(password.begin(), password.end(), match); + auto bgn = std::sregex_iterator(str.begin(), str.end(), match); auto end = std::sregex_iterator(); if (bgn != end) { auto date = bgn->str(); - date_map[date]++; - type_map[i]++; + ret.emplace_back(std::make_pair(date, i)); break; } } + return ret; + }; + + std::ranges::copy(passwords(source), std::back_inserter(passwords_vec)); + partial.resize(passwords_vec.size()); + + { + timeit("regex find date"); + std::transform(std::execution::par, passwords_vec.begin(), passwords_vec.end(), partial.begin(), eval); + } + + { + timeit("count result"); + for (auto const &p : partial) { + for (auto const &r : p) { + date_map[r.first]++; + type_map[r.second]++; + } + } } std::vector> date_vec(date_map.begin(), date_map.end());