summaryrefslogtreecommitdiffstats
path: root/contrib/benchmarks/uscxml
diff options
context:
space:
mode:
authorStefan Radomski <github@mintwerk.de>2017-07-03 15:04:26 (GMT)
committerStefan Radomski <github@mintwerk.de>2017-07-03 15:04:26 (GMT)
commit19d4e8ae2e472dd364ffeff1e096d3f75d5251c4 (patch)
treef006846b1f4bf207d0c8229b52d4948bb1497b63 /contrib/benchmarks/uscxml
parentfbda090a39ad02c937345bee204ca3f77106b2bf (diff)
downloaduscxml-19d4e8ae2e472dd364ffeff1e096d3f75d5251c4.zip
uscxml-19d4e8ae2e472dd364ffeff1e096d3f75d5251c4.tar.gz
uscxml-19d4e8ae2e472dd364ffeff1e096d3f75d5251c4.tar.bz2
BEnchmarks and performance improvements
Diffstat (limited to 'contrib/benchmarks/uscxml')
-rw-r--r--contrib/benchmarks/uscxml/statesPerSecond.cpp69
1 files changed, 69 insertions, 0 deletions
diff --git a/contrib/benchmarks/uscxml/statesPerSecond.cpp b/contrib/benchmarks/uscxml/statesPerSecond.cpp
new file mode 100644
index 0000000..f6e62e6
--- /dev/null
+++ b/contrib/benchmarks/uscxml/statesPerSecond.cpp
@@ -0,0 +1,69 @@
+#include <iostream>
+#include <chrono>
+#include <stdlib.h>
+
+#include "uscxml/uscxml.h"
+#include "uscxml/interpreter/InterpreterMonitor.h"
+#include "uscxml/util/DOM.h"
+
+using namespace std;
+using namespace uscxml;
+using namespace std::chrono;
+
+long iterations = 0;
+long initMs = 0;
+system_clock::time_point now;
+system_clock::time_point report;
+system_clock::time_point endTime;
+
+class PerfMon : public InterpreterMonitor {
+ public:
+ virtual void beforeEnteringState(Interpreter& interpreter, const XERCESC_NS::DOMElement* state) {
+ if (HAS_ATTR(state, X("id")) && ATTR(state, X("id")) == "mark") {
+ iterations++;
+ now = system_clock::now();
+ if (now > report) {
+ report = now + seconds(1);
+ std::cout << initMs << ", " << iterations << std::endl;
+ iterations = 0;
+ }
+ }
+ if (now > endTime) {
+ ::exit(EXIT_SUCCESS);
+ }
+ }
+};
+
+int main(int argc, char *argv[])
+{
+ system_clock::time_point start = system_clock::now();
+
+ Interpreter sc = Interpreter::fromURL(argv[1]);
+ ActionLanguage al;
+ if (argc > 2) {
+ if (std::string(argv[2]) == "large") {
+ al.microStepper = Factory::getInstance()->createMicroStepper("large", (MicroStepCallbacks*)sc);
+ } else {
+ al.microStepper = Factory::getInstance()->createMicroStepper("fast", (MicroStepCallbacks*)sc);
+ }
+ }
+ sc.setActionLanguage(al);
+
+ InterpreterState state = sc.step(); // initialize?
+
+ PerfMon mon;
+ sc.addMonitor(&mon);
+
+ now = system_clock::now();
+ initMs = duration_cast<milliseconds>(now - start).count();
+
+ start = now;
+ report = start + seconds(1);
+ endTime = start + seconds(10);
+
+ while(true) {
+ sc.step();
+ }
+
+ return 0;
+}