Here's some profiling on the codecompletion plugin. Results are interesting...
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
15.79 0.12 0.12 32143644 0.00 0.00 wxStringBase::at(unsigned int) const
13.16 0.22 0.10 32143644 0.00 0.00 wxString::GetChar(unsigned int) const
7.89 0.28 0.06 7299941 0.00 0.00 Tokenizer::IsEOF() const
6.58 0.33 0.05 66867 0.00 0.00 Tokenizer::CompactSpaces(wxString&) const
5.26 0.37 0.04 25016299 0.00 0.00 Tokenizer::CurrentChar() const
5.26 0.41 0.04 69053 0.00 0.00 Tokenizer::SkipBlock(char const&)
3.95 0.44 0.03 6016913 0.00 0.00 Tokenizer::MoveToNextChar(unsigned int)
2.63 0.46 0.02 1454827 0.00 0.00 wxString::append(unsigned int, char)
2.63 0.48 0.02 1060893 0.00 0.00 wxStringBase::empty() const
2.63 0.50 0.02 818659 0.00 0.00 wxString::operator char const*() const
2.63 0.52 0.02 444750 0.00 0.00 Tokenizer::DoGetToken()
2.63 0.54 0.02 108887 0.00 0.00 SearchTreeNode::GetDeepestMatchingPosition(BasicSearchTree*, wxString const&, unsigned int)
1.32 0.55 0.01 6489068 0.00 0.00 wxStringBase::size() const
1.32 0.56 0.01 2880137 0.00 0.00 wxStringBase::at(unsigned int)
1.32 0.57 0.01 2880137 0.00 0.00 wxString::operator[](unsigned int)
1.32 0.58 0.01 2809196 0.00 0.00 Tokenizer::NotEOF() const
1.32 0.59 0.01 1520388 0.00 0.00 wxString::~wxString()
1.32 0.60 0.01 1454827 0.00 0.00 wxString::operator<<(char)
1.32 0.61 0.01 687707 0.00 0.00 wxBaseArrayPtrVoid::operator[](unsigned int) const
1.32 0.62 0.01 669131 0.00 0.00 TokensArray::operator[](unsigned int) const
1.32 0.63 0.01 460889 0.00 0.00 wxStringData::Lock()
1.32 0.64 0.01 423075 0.00 0.00 std::_Rb_tree<char, std::pair<char const, unsigned int>, std::_Select1st<std::pair<char const, unsigned int> >, std::less<char>, std::allocator<std::pair<char const, unsigned int> > >::_S_key(std::_Rb_tree_node<std::pair<char const, unsigned int> > const*)
1.32 0.65 0.01 368749 0.00 0.00 __gnu_cxx::__normal_iterator<SearchTreeNode**, std::vector<SearchTreeNode*, std::allocator<SearchTreeNode*> > >::operator+(int const&) const
1.32 0.66 0.01 245572 0.00 0.00 std::_Rb_tree<char, std::pair<char const, unsigned int>, std::_Select1st<std::pair<char const, unsigned int> >, std::less<char>, std::allocator<std::pair<char const, unsigned int> > >::end()
1.32 0.67 0.01 122763 0.00 0.00 std::vector<SearchTreeNode*, std::allocator<SearchTreeNode*> >::size() const
1.32 0.68 0.01 116830 0.00 0.00 BasicSearchTree::GetNode(unsigned int, bool)
1.32 0.69 0.01 97276 0.00 0.00 operator==(wxString const&, char const*)
1.32 0.70 0.01 76280 0.00 0.00 wxString::append(wxString const&)
1.32 0.71 0.01 25307 0.00 0.00 BasicSearchTree::FindNode(wxString const&, unsigned int, SearchTreePoint*)
1.32 0.72 0.01 25185 0.00 0.00 SearchTree<TokensArray>::GetItemAtPos(unsigned int)
1.32 0.73 0.01 14523 0.00 0.00 std::_Rb_tree<unsigned int, std::pair<unsigned int const, unsigned int>, std::_Select1st<std::pair<unsigned int const, unsigned int> >, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, unsigned int> > >::_M_get_node()
1.32 0.74 0.01 10563 0.00 0.00 void std::_Construct<std::pair<char const, unsigned int>, std::pair<char const, unsigned int> >(std::pair<char const, unsigned int>*, std::pair<char const, unsigned int> const&)
1.32 0.75 0.01 11 0.91 2.34 Parser::AddTreeNamespace(wxTreeCtrl&, wxTreeItemId const&, Token*)
1.32 0.76 0.01 1 10.00 10.29 BasicSearchTree::~BasicSearchTree()
0.00 0.76 0.00 8478747 0.00 0.00 wxStringBase::GetStringData() const
The rest of the functions and methods give zero time.