Performance Quiz #6 -- Looking at the fourth cut
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.