Strange running times in C++ loops -
so, i'm writing program, optimization key factor. however: during optimization, notice function considered relatively simple, taking way long run. since, in comparison, more difficult function taking way shorter.
// simple function int get_chunk_index(std::vector<chunk> chunks, int x, int y) { glm::vec3 target = glm::vec3(x * 40, 0, y * 40); (int = 0; < chunks.size(); i++) { if (chunks[i].trans.getpos() == target) { return i; } } return -1; } // end simple function
if more functions, feel free ask, quite large program, can't include everything here.
ps: chunks ever 0->40 in size.
a few simple options.
1) chunks
being passed value, creates complete copy of vector being passed. try passing const
reference (i.e. const std::vector<chunk> &chunk
) instead.
2) rather passing x
, y
, , creating glm::vec3
(whatever - it's non-standard) them, change function accept glm::vec3
reference. forces caller create object, allows caller control updating of (rather recreating new object every time).
3) take evaluation of chunks.size()
out of loop, , use preincrement (won't create temporary) rather post-increment.
std::size_t size = chunks.size(); (int = 0; < size; ++i) { if (chunks[i].trans.getpos() == target) { return i; } }
4) consider using iterators rather array indexing.
std::vector<chunk>::const_iterator i, begin = chunks.begin(), end = chunks.end(); (i = begin; != end; ++i) if (i->trans.getpos() == target) return std::distance(begin, i);
or (c++11 , later)
for (const auto &i : chunks) { if (i.trans.getpos() == target) return std::distance(chunks.begin(), i); }
5) instead of passing vector, pass begin
, end
iterators. allow more simplification of loop.
6) check getpos()
function being called doing, , optimise that.
7) timing measurements optimisation turned on, , them across large number of calls of function. performance measurements of individual function calls don't mean in practice (the jitter in other things affect performance dominate measurements).
wiki
Comments
Post a Comment