mirror of
https://github.com/GothenburgBitFactory/taskwarrior.git
synced 2025-06-26 10:54:26 +02:00
performance: Cache CLI2::canonicalize lookups
Canonicalization of attributes or attribute prefixes happens once per every single task considered in the filtering process. It maps short, prefixed names to their full-length versions, for example: "pro" -> "project" in the expression "project:Home" It follows that such process is not task-dependant and as such the lookups can be cached.
This commit is contained in:
parent
ab7f5b0b51
commit
a19773873a
2 changed files with 17 additions and 2 deletions
15
src/CLI2.cpp
15
src/CLI2.cpp
|
@ -699,8 +699,19 @@ const std::vector <std::string> CLI2::getWords ()
|
||||||
bool CLI2::canonicalize (
|
bool CLI2::canonicalize (
|
||||||
std::string& canonicalized,
|
std::string& canonicalized,
|
||||||
const std::string& category,
|
const std::string& category,
|
||||||
const std::string& value) const
|
const std::string& value)
|
||||||
{
|
{
|
||||||
|
// Utilize a cache mapping of (category, value) -> canonicalized value.
|
||||||
|
// This cache does not need to be invalidated, because entities are defined
|
||||||
|
// only once per initialization of the Context object.
|
||||||
|
int cache_key = 31 * std::hash<std::string>{} (category) + std::hash<std::string>{} (value);
|
||||||
|
auto cache_result = _canonical_cache.find (cache_key);
|
||||||
|
if (cache_result != _canonical_cache.end())
|
||||||
|
{
|
||||||
|
canonicalized = cache_result->second;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// Extract a list of entities for category.
|
// Extract a list of entities for category.
|
||||||
std::vector <std::string> options;
|
std::vector <std::string> options;
|
||||||
auto c = _entities.equal_range (category);
|
auto c = _entities.equal_range (category);
|
||||||
|
@ -710,6 +721,7 @@ bool CLI2::canonicalize (
|
||||||
if (value == e->second)
|
if (value == e->second)
|
||||||
{
|
{
|
||||||
canonicalized = value;
|
canonicalized = value;
|
||||||
|
_canonical_cache[cache_key] = value;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -721,6 +733,7 @@ bool CLI2::canonicalize (
|
||||||
if (autoComplete (value, options, matches, minimumMatchLength) == 1)
|
if (autoComplete (value, options, matches, minimumMatchLength) == 1)
|
||||||
{
|
{
|
||||||
canonicalized = matches[0];
|
canonicalized = matches[0];
|
||||||
|
_canonical_cache[cache_key] = matches[0];
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
#include <unordered_map>
|
||||||
#include <Lexer.h>
|
#include <Lexer.h>
|
||||||
#include <FS.h>
|
#include <FS.h>
|
||||||
|
|
||||||
|
@ -77,7 +78,7 @@ public:
|
||||||
void addContext (bool readable, bool writeable);
|
void addContext (bool readable, bool writeable);
|
||||||
void prepareFilter ();
|
void prepareFilter ();
|
||||||
const std::vector <std::string> getWords ();
|
const std::vector <std::string> getWords ();
|
||||||
bool canonicalize (std::string&, const std::string&, const std::string&) const;
|
bool canonicalize (std::string&, const std::string&, const std::string&);
|
||||||
std::string getBinary () const;
|
std::string getBinary () const;
|
||||||
std::string getCommand (bool canonical = true) const;
|
std::string getCommand (bool canonical = true) const;
|
||||||
const std::string dump (const std::string& title = "CLI2 Parser") const;
|
const std::string dump (const std::string& title = "CLI2 Parser") const;
|
||||||
|
@ -109,6 +110,7 @@ private:
|
||||||
public:
|
public:
|
||||||
std::multimap <std::string, std::string> _entities {};
|
std::multimap <std::string, std::string> _entities {};
|
||||||
std::map <std::string, std::string> _aliases {};
|
std::map <std::string, std::string> _aliases {};
|
||||||
|
std::unordered_map <int, std::string> _canonical_cache {};
|
||||||
std::vector <A2> _original_args {};
|
std::vector <A2> _original_args {};
|
||||||
std::vector <A2> _args {};
|
std::vector <A2> _args {};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue