time_pcre.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 177 行
CPP
177 行
/* * * Copyright (c) 2002 * John Maddock * * Use, modification and distribution are subject to the * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * */#include <cassert>#include <cfloat>#include "regex_comparison.hpp"#ifdef BOOST_HAS_PCRE#include "pcre.h"#include <boost/timer.hpp>namespace pcr{double time_match(const std::string& re, const std::string& text, bool icase){ pcre *ppcre; const char *error; int erroffset; int what[50]; boost::timer tim; int iter = 1; int counter, repeats; double result = 0; double run; if(0 == (ppcre = pcre_compile(re.c_str(), (icase ? PCRE_CASELESS | PCRE_ANCHORED | PCRE_DOTALL | PCRE_MULTILINE : PCRE_ANCHORED | PCRE_DOTALL | PCRE_MULTILINE), &error, &erroffset, NULL))) { free(ppcre); return -1; } pcre_extra *pe; pe = pcre_study(ppcre, 0, &error); if(error) { free(ppcre); free(pe); return -1; } do { tim.restart(); for(counter = 0; counter < iter; ++counter) { erroffset = pcre_exec(ppcre, pe, text.c_str(), text.size(), 0, 0, what, sizeof(what)/sizeof(int)); } result = tim.elapsed(); iter *= 2; }while(result < 0.5); iter /= 2; // repeat test and report least value for consistency: for(repeats = 0; repeats < REPEAT_COUNT; ++repeats) { tim.restart(); for(counter = 0; counter < iter; ++counter) { erroffset = pcre_exec(ppcre, pe, text.c_str(), text.size(), 0, 0, what, sizeof(what)/sizeof(int)); } run = tim.elapsed(); result = (std::min)(run, result); } free(ppcre); free(pe); return result / iter;}double time_find_all(const std::string& re, const std::string& text, bool icase){ pcre *ppcre; const char *error; int erroffset; int what[50]; boost::timer tim; int iter = 1; int counter, repeats; double result = 0; double run; int exec_result; int matches; if(0 == (ppcre = pcre_compile(re.c_str(), (icase ? PCRE_CASELESS | PCRE_DOTALL | PCRE_MULTILINE : PCRE_DOTALL | PCRE_MULTILINE), &error, &erroffset, NULL))) { free(ppcre); return -1; } pcre_extra *pe; pe = pcre_study(ppcre, 0, &error); if(error) { free(ppcre); free(pe); return -1; } do { int startoff; tim.restart(); for(counter = 0; counter < iter; ++counter) { matches = 0; startoff = 0; exec_result = pcre_exec(ppcre, pe, text.c_str(), text.size(), startoff, 0, what, sizeof(what)/sizeof(int)); while(exec_result >= 0) { ++matches; startoff = what[1]; exec_result = pcre_exec(ppcre, pe, text.c_str(), text.size(), startoff, 0, what, sizeof(what)/sizeof(int)); } } result = tim.elapsed(); iter *= 2; }while(result < 0.5); iter /= 2; if(result >10) return result / iter; result = DBL_MAX; // repeat test and report least value for consistency: for(repeats = 0; repeats < REPEAT_COUNT; ++repeats) { int startoff; matches = 0; tim.restart(); for(counter = 0; counter < iter; ++counter) { matches = 0; startoff = 0; exec_result = pcre_exec(ppcre, pe, text.c_str(), text.size(), startoff, 0, what, sizeof(what)/sizeof(int)); while(exec_result >= 0) { ++matches; startoff = what[1]; exec_result = pcre_exec(ppcre, pe, text.c_str(), text.size(), startoff, 0, what, sizeof(what)/sizeof(int)); } } run = tim.elapsed(); result = (std::min)(run, result); } return result / iter;}}#elsenamespace pcr{double time_match(const std::string& re, const std::string& text, bool icase){ return -1;}double time_find_all(const std::string& re, const std::string& text, bool icase){ return -1;}}#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?