Don't use std::copy and std::copy_backward, run 10% faster.

Sometimes std::copy can become a memmove call, and that is not a good idea when
copying relatively few bytes as we are doing. We also get a small win by
changing two loops into one.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120265 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jakob Stoklund Olesen 2010-11-28 22:17:14 +00:00
parent 5f456cda98
commit 08d55342e3

View File

@ -103,7 +103,6 @@
#include "llvm/ADT/PointerIntPair.h"
#include "llvm/Support/Allocator.h"
#include "llvm/Support/RecyclingAllocator.h"
#include <limits>
#include <iterator>
// FIXME: Remove debugging code.
@ -211,8 +210,10 @@ public:
unsigned j, unsigned Count) {
assert(i + Count <= M && "Invalid source range");
assert(j + Count <= N && "Invalid dest range");
std::copy(Other.first + i, Other.first + i + Count, first + j);
std::copy(Other.second + i, Other.second + i + Count, second + j);
for (unsigned e = i + Count; i != e; ++i, ++j) {
first[j] = Other.first[i];
second[j] = Other.second[i];
}
}
/// moveLeft - Move elements to the left.
@ -231,8 +232,10 @@ public:
void moveRight(unsigned i, unsigned j, unsigned Count) {
assert(i <= j && "Use moveLeft shift elements left");
assert(j + Count <= N && "Invalid range");
std::copy_backward(first + i, first + i + Count, first + j + Count);
std::copy_backward(second + i, second + i + Count, second + j + Count);
while (Count--) {
first[j + Count] = first[i + Count];
second[j + Count] = second[i + Count];
}
}
/// erase - Erase elements [i;j).