diff options
author | John Wiegley <johnw@newartisans.com> | 2009-11-14 04:29:53 -0500 |
---|---|---|
committer | John Wiegley <johnw@newartisans.com> | 2009-11-14 04:29:53 -0500 |
commit | d89c60f49cf1eb2df3cc761b9790e6fc47cc7c96 (patch) | |
tree | ac53702dbc7050e3d7c7dfb5de4b9a085e80826d | |
parent | e3064b952029a4fe8f7b65442d23e1112f26bb5f (diff) | |
download | fork-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.
-rw-r--r-- | src/xact.cc | 17 | ||||
-rw-r--r-- | src/xact.h | 2 |
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", @@ -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, ""); } |