How to speed-up a simple method? (possibily without changing interfaces or data structures)
Posted
by baol
on Stack Overflow
See other posts from Stack Overflow
or by baol
Published on 2010-04-04T15:25:23Z
Indexed on
2010/04/04
15:33 UTC
Read the original article
Hit count: 238
Hello.
I have some data structures:
all_unordered_mordered_mis a big vector containing all the strings I need (all different)ordered_mis a small vector containing the indexes of a subset of the strings (all different) in the former vectorposition_mmaps the indexes of objects from the first vector to their position in the second one.
The string_after(index, reverse) method returns the string referenced by ordered_m after all_unordered_m[index].
ordered_m is considered circular, and is explored in natural or reverse order depending on the second parameter.
The code is something like the following:
struct ordered_subset {
// [...]
std::vector<std::string>& all_unordered_m; // size = n >> 1
std::vector<size_t> ordered_m; // size << n
std::map<size_t, size_t> position_m; // positions of strings in ordered_m
const std::string&
string_after(size_t index, bool reverse) const
{
size_t pos = position_m.find(index)->second;
if(reverse)
pos = (pos == 0 ? orderd_m.size() - 1 : pos - 1);
else
pos = (pos == ordered.size() - 1 ? 0 : pos + 1);
return all_unordered_m[ordered_m[pos]];
}
};
Given that:
- I do need all of the data-structures for other purposes;
- I cannot change them because I need to access the strings:
- by their id in the all_unordered_m;
- by their index inside the various ordered_m;
- I need to know the position of a string (identified by it's position in the first vector) inside ordered_m vector;
- I cannot change the string_after interface without changing most of the program.
How can I speed up the string_after method that is called billions of times and is eating up about 10% of the execution time?
© Stack Overflow or respective owner