Сделал образец C ++ переносимым:
#include <iostream>
#include <chrono>
#include <regex>
using C = std::chrono::high_resolution_clock;
using namespace std::chrono_literals;
int main()
{
auto start = C::now();
std::regex pat("^[\\w._]+@\\w+\\.[a-zA-Z]+$");
for (long i = 0; i < 1000000; i++) {
regex_match("abcd_ed123.t12y@haha.com", pat);
}
std::cout << (C::now() - start)/1.0ms;
}
На Linux, а с clang++ -std=c++14 -march=native -O3 -o clang ./test.cpp
я получаю 595.970 ms
.См. Также Live On Wandbox
Java работает в 561 ms
на той же машине.
Обновление : Boost Regex работает намного быстрее, см. Ниже сравнительный тест
Предупреждение : синтетические тесты, подобные этим, очень подвержены ошибкам:Компилятор может почувствовать, что не наблюдается никаких видимых побочных эффектов, и оптимизировать весь цикл, просто чтобы привести пример.
Больше удовольствия: добавление повышения к миксу
Использование Boost 1.67 и Платформа микро-бенчмаркинга Nonius
Мы можем видеть, что реализации Regex в Boost значительно быстрее.
См. подробные примеры интерактивных данных онлайн: https://plot.ly/~sehe/25/
Используемый код
#include <iostream>
#include <regex>
#include <boost/regex.hpp>
#include <boost/xpressive/xpressive_static.hpp>
#define NONIUS_RUNNER
#include <nonius/benchmark.h++>
#include <nonius/main.h++>
template <typename Re>
void test(Re const& re) {
regex_match("abcd_ed123.t12y@haha.com", re);
}
static const std::regex std_normal("^[\\w._]+@\\w+\\.[a-zA-Z]+$");
static const std::regex std_optimized("^[\\w._]+@\\w+\\.[a-zA-Z]+$", std::regex::ECMAScript | std::regex::optimize);
static const boost::regex boost_normal("^[\\w._]+@\\w+\\.[a-zA-Z]+$");
static const boost::regex boost_optimized("^[\\w._]+@\\w+\\.[a-zA-Z]+$", static_cast<boost::regex::flag_type>(boost::regex::ECMAScript | boost::regex::optimize));
static const auto boost_xpressive = []{
using namespace boost::xpressive;
return cregex { bos >> +(_w | '.' | '_') >> '@' >> +_w >> '.' >> +alpha >> eos };
}();
NONIUS_BENCHMARK("std_normal", [] { test(std_normal); })
NONIUS_BENCHMARK("std_optimized", [] { test(std_optimized); })
NONIUS_BENCHMARK("boost_normal", [] { test(boost_normal); })
NONIUS_BENCHMARK("boost_optimized", [] { test(boost_optimized); })
NONIUS_BENCHMARK("boost_xpressive", [] { test(boost_xpressive); })
Примечание Вот выходные данные JIT-компилятора Hotspot:
Это было сгенерировано с помощью
LD_PRELOAD = / home / sehe / Projects / stackoverflow / fcml-1.1.3 / example / hsdis / .libs / libhsdis-amd64.so ./jre1.8.0_171/bin/java -XX: + UnlockDiagnosticVMOptions -XX: + PrintAssembly Main 2> & 1> disasm.a