From 960adfbc3e19b684f5f3839782f2c1399eabd533 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 30 Apr 2014 19:52:18 +0200 Subject: Add performance example --- examples/performance/driver.cxx | 138 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 examples/performance/driver.cxx (limited to 'examples/performance/driver.cxx') diff --git a/examples/performance/driver.cxx b/examples/performance/driver.cxx new file mode 100644 index 0000000..7d096d6 --- /dev/null +++ b/examples/performance/driver.cxx @@ -0,0 +1,138 @@ +// file : examples/performance/driver.cxx +// copyright : not copyrighted - public domain + +#include +#include +#include + +#include + +#include "time.hxx" + +using namespace std; +using namespace xml; + +const unsigned long iterations = 1000; + +int +main (int argc, char* argv[]) +{ + if (argc != 2) + { + cerr << "usage: " << argv[0] << " " << endl; + return 1; + } + + try + { + ifstream ifs; + ifs.exceptions (ios_base::failbit); + ifs.open (argv[1], ios::in | ios::ate); + + size_t size (ifs.tellg ()); + ifs.seekg (0, ios::beg); + + char* buf = new char[size]; + ifs.read (buf, size); + + cerr << " document size: " << size << " bytes" << endl; + + unsigned long start_count; + unsigned long end_count; + + // Warmup. + // + for (unsigned long i (0); i < 10; ++i) + { + start_count = 0; + end_count = 0; + + // Configure the parser to receive attributes as events without + // creating the attribute map. + // + parser p (buf, + size, + argv[1], + parser::receive_default | parser::receive_attributes_event); + + for (parser::event_type e (p.next ()); e != parser::eof; e = p.next ()) + { + switch (e) + { + case parser::start_element: + start_count++; + break; + case parser::end_element: + end_count++; + break; + default: + break; + } + } + } + + cerr << " elements: " << start_count << endl; + + os::time start; + + for (unsigned long i (0); i < iterations; ++i) + { + start_count = 0; + end_count = 0; + + // Configure the parser to receive attributes as events without + // creating the attribute map. + // + parser p (buf, + size, + argv[1], + parser::receive_default | parser::receive_attributes_event); + + for (parser::event_type e (p.next ()); e != parser::eof; e = p.next ()) + { + switch (e) + { + case parser::start_element: + start_count++; + break; + case parser::end_element: + end_count++; + break; + default: + break; + } + } + } + + os::time end; + + delete[] buf; + + os::time time (end - start); + double ms ( + static_cast ( + time.sec () * 1000000ULL + time.nsec () / 1000ULL)); + + cerr << " time: " << time << " sec" << endl; + + // Calculate throughput in documents/sec. + // + double tpd ((iterations / ms) * 1000000); + cerr << " throughput: " << tpd << " documents/sec" << endl; + + // Calculate throughput in MBytes/sec. + // + double tpb (((size * iterations) / ms) * 1000000/(1024*1024)); + cerr << " throughput: " << tpb << " MBytes/sec" << endl; + } + catch (const ios_base::failure&) + { + cerr << "io failure" << endl; + return 1; + } + catch (const xml::exception& e) + { + cerr << e.what () << endl; + return 1; + } +} -- cgit v1.1