Raymond is definately making some great headway.  Having targetted the single-character at a time conversion problem in version 4 of his program he's 1.84 times faster than the previous version.

Version Execution Time
(seconds)
Unmanaged v1 1.328
Unmanaged v2 0.828
Unmanaged v3 0.343
Unmanaged v4 0.187

Unoptimized Managed port of v1      

0.124

As before I'm including the function costs in tree view, but only showing functions with an inclusive cost of at least 5% to keep the size of the report manageable.

Function Name (Sanitized)

 Exclusive
Percent
 Inclusive
Percent
  _mainCRTStartup 0.00 97.97
    _main 0.00 97.97
      Dictionary::Dictionary(void) 1.45 77.97
        MultiByteToWideChar 6.67 7.25
        std::vector<struct DictionaryEntry, ...>::insert(...) 0.29 14.20
          std::vector<struct DictionaryEntry, ...>::insert(...) 0.58 13.62
            std::vector<struct DictionaryEntry, ...>::_Ucopy(...) 0.00 6.67
              std::_Construct<struct DictionaryEntry,struct DictionaryEntry>(...) 0.29 6.67
                DictionaryEntry::DictionaryEntry(struct DictionaryEntry const &) 0.29 6.38
                  std::basic_string<...>::basic_string<...>(class std::basic_string<...> const &) 2.03 6.09
        std::basic_string<...>::basic_string<...>(unsigned short const *,...) 0.29 7.83
          std::basic_string<...>::assign(unsigned short const *,unsigned int) 0.00 7.54
        DictionaryEntry::Parse(class std::basic_string<….> const &) 1.16 33.33
          std::basic_string<...>::assign(...) 0.29 28.70
            std::basic_string<...>::_Grow(unsigned int,bool) 0.58 26.09
              std::basic_string<...>::_Copy(unsigned int) 1.16 25.22
                operator new(unsigned int) 0.58 24.06
                  0.29 23.19
                    2.61 22.90
                      AllocateHeap 4.06 21.45
      std::vector<struct DictionaryEntry,...>::~vector<...>(void) 0.00 18.84
        std::vector<struct DictionaryEntry,class std::allocator<….>::_Destroy(...) 0.00 18.84
          DictionaryEntry::~DictionaryEntry(void) 0.29 18.26
            std::basic_string<...>::~basic_string<...>(void) 0.58 17.68
              std::basic_string<...>::_Tidy(bool) 1.16 17.10
                _free 0.29 15.65
                  FreeHeap 4.35 15.36

So looking at this new program it seems like its time to start targetting string management and the allocations.  We're spending 24% of our time just allocating strings.  Now what's interesting is that at this point things are fast enough that the tear-down at the end is getting to be signficant -- at 18.84% it's a good chunk of the cost.