summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2009-11-14 04:29:53 -0500
committerJohn Wiegley <johnw@newartisans.com>2009-11-14 04:29:53 -0500
commitd89c60f49cf1eb2df3cc761b9790e6fc47cc7c96 (patch)
treeac53702dbc7050e3d7c7dfb5de4b9a085e80826d /src
parente3064b952029a4fe8f7b65442d23e1112f26bb5f (diff)
downloadfork-ledger-d89c60f49cf1eb2df3cc761b9790e6fc47cc7c96.tar.gz
fork-ledger-d89c60f49cf1eb2df3cc761b9790e6fc47cc7c96.tar.bz2
fork-ledger-d89c60f49cf1eb2df3cc761b9790e6fc47cc7c96.zip
Memoize results from the fast predicate matcher
This gains another 15% for the parser, again with a very simple change that has no impact if the fast predicate matcher fails to work.
Diffstat (limited to 'src')
-rw-r--r--src/xact.cc17
-rw-r--r--src/xact.h2
2 files changed, 18 insertions, 1 deletions
diff --git a/src/xact.cc b/src/xact.cc
index 330ad38a..a84b4dca 100644
--- a/src/xact.cc
+++ b/src/xact.cc
@@ -597,10 +597,25 @@ void auto_xact_t::extend_xact(xact_base_t& xact)
bool matches_predicate = false;
if (try_quick_match) {
try {
+ bool found_memoized_result = false;
+ if (! memoized_results.empty()) {
+ std::map<string, bool>::iterator i =
+ memoized_results.find(initial_post->account->fullname());
+ if (i != memoized_results.end()) {
+ found_memoized_result = true;
+ matches_predicate = (*i).second;
+ }
+ }
+
// Since the majority of people who use automated transactions simply
// match against account names, try using a *much* faster version of
// the predicate evaluator.
- matches_predicate = post_pred(predicate.get_op(), *initial_post);
+ if (! found_memoized_result) {
+ matches_predicate = post_pred(predicate.get_op(), *initial_post);
+ memoized_results.insert
+ (std::pair<string, bool>(initial_post->account->fullname(),
+ matches_predicate));
+ }
}
catch (...) {
DEBUG("xact.extend.fail",
diff --git a/src/xact.h b/src/xact.h
index 07f9a6c7..c819b2a0 100644
--- a/src/xact.h
+++ b/src/xact.h
@@ -148,6 +148,8 @@ public:
predicate_t predicate;
bool try_quick_match;
+ std::map<string, bool> memoized_results;
+
auto_xact_t() : try_quick_match(true) {
TRACE_CTOR(auto_xact_t, "");
}