diff options
Diffstat (limited to 'src/boost/libs/xpressive/perf/command_line.cpp')
-rw-r--r-- | src/boost/libs/xpressive/perf/command_line.cpp | 261 |
1 files changed, 261 insertions, 0 deletions
diff --git a/src/boost/libs/xpressive/perf/command_line.cpp b/src/boost/libs/xpressive/perf/command_line.cpp new file mode 100644 index 00000000..1c77805d --- /dev/null +++ b/src/boost/libs/xpressive/perf/command_line.cpp @@ -0,0 +1,261 @@ +// (C) Copyright Eric Niebler 2006. +// Distributed under 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 <iostream> +#include <iomanip> +#include <fstream> +#include <deque> +#include <sstream> +#include <stdexcept> +#include <iterator> +#include "./regex_comparison.hpp" + +// +// globals: +// +bool time_boost = false; +bool time_greta = false; +bool time_safe_greta = false; +bool time_dynamic_xpressive = false; +bool time_static_xpressive = false; +//bool time_posix = false; +//bool time_pcre = false; + +bool test_matches = false; +bool test_short_twain = false; +bool test_long_twain = false; + +std::string xml_out_file; +std::string xml_contents; +std::list<results> result_list; + +int handle_argument(const std::string& what) +{ + if(what == "-b") + time_boost = true; + else if(what == "-g") + time_greta = true; + else if(what == "-gs") + time_safe_greta = true; + else if(what == "-dx") + time_dynamic_xpressive = true; + else if(what == "-sx") + time_static_xpressive = true; + //else if(what == "-posix") + // time_posix = true; + //else if(what == "-pcre") + // time_pcre = true; + else if(what == "-all") + { + time_boost = true; + time_greta = true; + time_safe_greta = true; + time_dynamic_xpressive = true; + time_static_xpressive = true; + //time_posix = true; + //time_pcre = true; + } + else if(what == "-test-matches") + test_matches = true; + else if(what == "-test-short-twain") + test_short_twain = true; + else if(what == "-test-long-twain") + test_long_twain = true; + else if(what == "-test-all") + { + test_matches = true; + test_short_twain = true; + test_long_twain = true; + } + else if((what == "-h") || (what == "--help")) + return show_usage(); + else if((what[0] == '-') || (what[0] == '/')) + { + std::cerr << "Unknown argument: \"" << what << "\"" << std::endl; + return 1; + } + else if(xml_out_file.size() == 0) + { + xml_out_file = what; + } + else + { + std::cerr << "Unexpected argument: \"" << what << "\"" << std::endl; + return 1; + } + return 0; +} + +int show_usage() +{ + std::cout << + "Usage\n" + "xprperf [-h] [library options] [test options] [xml_output_file]\n" + " -h Show help\n\n" + " library options:\n" + " -b Apply tests to boost library\n" + //" -ba Apply tests to boost library with a custom allocator\n" + //" -be Apply tests to experimental boost library\n" + //" -g Apply tests to GRETA library\n" + //" -gs Apply tests to GRETA library (in non-recursive mode)\n" + " -dx Apply tests to dynamic xpressive library\n" + " -sx Apply tests to static xpressive library\n" + //" -posix Apply tests to POSIX library\n" + //" -pcre Apply tests to PCRE library\n" + " -all Apply tests to all libraries\n\n" + " test options:\n" + " -test-matches Test short matches\n" + " -test-short-twain Test short searches\n" + " -test-long-twain Test long searches\n" + " -test-all Test everthing\n"; + return 1; +} + +void load_file(std::string& text, const char* file) +{ + std::deque<char> temp_copy; + std::ifstream is(file); + if(!is.good()) + { + std::string msg("Unable to open file: \""); + msg.append(file); + msg.append("\""); + throw std::runtime_error(msg); + } + std::istreambuf_iterator<char> it(is); + std::copy(it, std::istreambuf_iterator<char>(), std::back_inserter(temp_copy)); + text.erase(); + text.reserve(temp_copy.size()); + text.append(temp_copy.begin(), temp_copy.end()); +} + +struct xml_double +{ + double d_; + xml_double( double d ) : d_(d) {} + friend std::ostream & operator<<( std::ostream & out, xml_double const & xd ) + { + std::ostringstream tmp; + tmp << std::setprecision(out.precision()) << xd.d_; + std::string str = tmp.str(); + std::string::size_type i = str.find( '-' ); + if( i != std::string::npos ) + str.replace( i, 1, "‑" ); + return out << str; + } +}; + +void print_result(std::ostream& os, double time, double best) +{ + static const char* suffixes[] = {"s", "ms", "us", "ns", "ps", }; + + if(time < 0) + { + os << "<entry>NA</entry>"; + return; + } + double rel = time / best; + bool highlight = ((rel > 0) && (rel < 1.1)); + unsigned suffix = 0; + while(time < 0) + { + time *= 1000; + ++suffix; + } + os << "<entry>"; + if(highlight) + os << "<phrase role=\"highlight\">"; + if(rel <= 1000) + os << std::setprecision(3) << xml_double(rel); + else + os << (int)rel; + os << "<para/>("; + if(time <= 1000) + os << std::setprecision(3) << xml_double(time); + else + os << (int)time; + os << suffixes[suffix] << ")"; + if(highlight) + os << "</phrase>"; + os << "</entry>"; +} + +void output_xml_results(bool show_description, const std::string& title, const std::string& filename) +{ + std::stringstream os; + // Generate the copyright and license on the output file + os << "<!--\n" + " Copyright 2004 Eric Niebler.\n" + "\n" + " Distributed under the Boost Software License, Version 1.0.\n" + " (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n" + "-->\n"; + + if(result_list.size()) + { + // calculate the number of columns in this table + int num_cols = 1 + show_description + time_greta + time_safe_greta + + time_dynamic_xpressive + time_static_xpressive + time_boost; + + // + // start by outputting the table header: + // + os << "<informaltable frame=\"all\">\n"; + os << "<bridgehead renderas=\"sect4\">" + "<phrase role=\"table-title\">" << title << "</phrase>" + "</bridgehead>\n"; + os << "<tgroup cols=\"" << num_cols << "\">\n"; + os << "<thead>\n"; + os << "<row>\n"; + + if(time_static_xpressive) os << "<entry>static xpressive</entry>"; + if(time_dynamic_xpressive) os << "<entry>dynamic xpressive</entry>"; + if(time_greta) os << "<entry>GRETA</entry>"; + if(time_safe_greta) os << "<entry>GRETA<para/>(non-recursive mode)</entry>"; + if(time_boost) os << "<entry>Boost</entry>"; + //if(time_posix) os << "<entry>POSIX</entry>"; + //if(time_pcre) os << "<entry>PCRE</entry>"; + if(show_description) os << "<entry>Text</entry>"; + os << "<entry>Expression</entry>"; + os << "\n</row>\n"; + os << "</thead>\n"; + os << "<tbody>\n"; + + // + // Now enumerate through all the test results: + // + std::list<results>::const_iterator first, last; + first = result_list.begin(); + last = result_list.end(); + while(first != last) + { + os << "<row>\n"; + if(time_static_xpressive) print_result(os, first->static_xpressive_time, first->factor); + if(time_dynamic_xpressive) print_result(os, first->dynamic_xpressive_time, first->factor); + if(time_greta) print_result(os, first->greta_time, first->factor); + if(time_safe_greta) print_result(os, first->safe_greta_time, first->factor); + if(time_boost) print_result(os, first->boost_time, first->factor); + //if(time_posix) print_result(os, first->posix_time, first->factor); + //if(time_pcre) print_result(os, first->pcre_time, first->factor); + if(show_description) os << "<entry>" << first->description << "</entry>"; + os << "<entry><literal>" << first->expression << "</literal></entry>"; + os << "\n</row>\n"; + ++first; + } + + os << "</tbody>\n" + "</tgroup>\n" + "</informaltable>\n"; + + result_list.clear(); + } + else + { + os << "<para><emphasis>Results not available...</emphasis></para>\n"; + } + + std::ofstream file(filename.c_str()); + file << os.str(); +} |