blob: f5192187c75813829917d89796098ca793b423c7 [file] [log] [blame]
/*
*
* 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_POSIX
#include <boost/timer.hpp>
#include "regex.h"
namespace posix{
double time_match(const std::string& re, const std::string& text, bool icase)
{
regex_t e;
regmatch_t what[20];
boost::timer tim;
int iter = 1;
int counter, repeats;
double result = 0;
double run;
if(0 != ::regcomp(&e, re.c_str(), (icase ? REG_ICASE | REG_EXTENDED : REG_EXTENDED)))
return -1;
do
{
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
regexec(&e, text.c_str(), e.re_nsub, what, 0);
}
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)
{
regexec(&e, text.c_str(), e.re_nsub, what, 0);
}
run = tim.elapsed();
result = (std::min)(run, result);
}
regfree(&e);
return result / iter;
}
double time_find_all(const std::string& re, const std::string& text, bool icase)
{
regex_t e;
regmatch_t what[20];
memset(what, 0, sizeof(what));
boost::timer tim;
int iter = 1;
int counter, repeats;
double result = 0;
double run;
int exec_result;
int matches;
if(0 != regcomp(&e, re.c_str(), (icase ? REG_ICASE | REG_EXTENDED : REG_EXTENDED)))
return -1;
do
{
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
what[0].rm_so = 0;
what[0].rm_eo = text.size();
matches = 0;
exec_result = regexec(&e, text.c_str(), 20, what, REG_STARTEND);
while(exec_result == 0)
{
++matches;
what[0].rm_so = what[0].rm_eo;
what[0].rm_eo = text.size();
exec_result = regexec(&e, text.c_str(), 20, what, REG_STARTEND);
}
}
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)
{
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
what[0].rm_so = 0;
what[0].rm_eo = text.size();
matches = 0;
exec_result = regexec(&e, text.c_str(), 20, what, REG_STARTEND);
while(exec_result == 0)
{
++matches;
what[0].rm_so = what[0].rm_eo;
what[0].rm_eo = text.size();
exec_result = regexec(&e, text.c_str(), 20, what, REG_STARTEND);
}
}
run = tim.elapsed();
result = (std::min)(run, result);
}
return result / iter;
}
}
#else
namespace posix{
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