PIDeque important performance fix
This commit is contained in:
@@ -78,6 +78,7 @@ endif()
|
|||||||
|
|
||||||
if (NOT BUILDING_pip)
|
if (NOT BUILDING_pip)
|
||||||
shstk_find_header(pip PIP "pip_version.h" "${_PIP_LIBRARY_PATH_}")
|
shstk_find_header(pip PIP "pip_version.h" "${_PIP_LIBRARY_PATH_}")
|
||||||
|
set(PIP_INCLUDES "${pip_INCLUDES}" CACHE STRING "")
|
||||||
endif()
|
endif()
|
||||||
if(PIP_FIND_VERSION VERSION_GREATER PIP_VERSION)
|
if(PIP_FIND_VERSION VERSION_GREATER PIP_VERSION)
|
||||||
message(FATAL_ERROR "PIP version ${PIP_VERSION} is available, but ${PIP_FIND_VERSION} requested!")
|
message(FATAL_ERROR "PIP version ${PIP_VERSION} is available, but ${PIP_FIND_VERSION} requested!")
|
||||||
|
|||||||
@@ -228,6 +228,7 @@ public:
|
|||||||
inline PIDeque<T> & clear() {
|
inline PIDeque<T> & clear() {
|
||||||
PIINTROSPECTION_CONTAINER_UNUSED(T, pid_size)
|
PIINTROSPECTION_CONTAINER_UNUSED(T, pid_size)
|
||||||
pid_size = 0;
|
pid_size = 0;
|
||||||
|
pid_start = (pid_rsize - pid_size) / 2;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -258,6 +259,8 @@ public:
|
|||||||
if (new_size < pid_size) {
|
if (new_size < pid_size) {
|
||||||
deleteT(&(pid_data[new_size + pid_start]), pid_size - new_size);
|
deleteT(&(pid_data[new_size + pid_start]), pid_size - new_size);
|
||||||
pid_size = new_size;
|
pid_size = new_size;
|
||||||
|
if (new_size == 0)
|
||||||
|
pid_start = (pid_rsize - pid_size) / 2;
|
||||||
}
|
}
|
||||||
if (new_size > pid_size) {
|
if (new_size > pid_size) {
|
||||||
size_t os = pid_size;
|
size_t os = pid_size;
|
||||||
@@ -291,6 +294,8 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline PIDeque<T> & insert(size_t index, const T & v = T()) {
|
inline PIDeque<T> & insert(size_t index, const T & v = T()) {
|
||||||
|
if (index == pid_size) return push_back(v);
|
||||||
|
PIINTROSPECTION_CONTAINER_USED(T, 1)
|
||||||
bool dir = pid_rsize <= 2 ? true : (index >= pid_rsize / 2 ? true : false);
|
bool dir = pid_rsize <= 2 ? true : (index >= pid_rsize / 2 ? true : false);
|
||||||
if (dir) {
|
if (dir) {
|
||||||
alloc(pid_size + 1, true);
|
alloc(pid_size + 1, true);
|
||||||
@@ -303,11 +308,12 @@ public:
|
|||||||
if (index > 0)
|
if (index > 0)
|
||||||
memmove((void*)(&(pid_data[pid_start])), (const void*)(&(pid_data[pid_start + 1])), index * sizeof(T));
|
memmove((void*)(&(pid_data[pid_start])), (const void*)(&(pid_data[pid_start + 1])), index * sizeof(T));
|
||||||
}
|
}
|
||||||
PIINTROSPECTION_CONTAINER_USED(T, 1)
|
|
||||||
elementNew(pid_data + pid_start + index, v);
|
elementNew(pid_data + pid_start + index, v);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
inline PIDeque<T> & insert(size_t index, T && v) {
|
inline PIDeque<T> & insert(size_t index, T && v) {
|
||||||
|
if (index == pid_size) return push_back(v);
|
||||||
|
PIINTROSPECTION_CONTAINER_USED(T, 1)
|
||||||
bool dir = pid_rsize <= 2 ? true : (index >= pid_rsize / 2 ? true : false);
|
bool dir = pid_rsize <= 2 ? true : (index >= pid_rsize / 2 ? true : false);
|
||||||
if (dir) {
|
if (dir) {
|
||||||
alloc(pid_size + 1, true);
|
alloc(pid_size + 1, true);
|
||||||
@@ -320,7 +326,6 @@ public:
|
|||||||
if (index > 0)
|
if (index > 0)
|
||||||
memmove((void*)(&(pid_data[pid_start])), (const void*)(&(pid_data[pid_start + 1])), index * sizeof(T));
|
memmove((void*)(&(pid_data[pid_start])), (const void*)(&(pid_data[pid_start + 1])), index * sizeof(T));
|
||||||
}
|
}
|
||||||
PIINTROSPECTION_CONTAINER_USED(T, 1)
|
|
||||||
elementNew(pid_data + pid_start + index, std::move(v));
|
elementNew(pid_data + pid_start + index, std::move(v));
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|||||||
158
main.cpp
158
main.cpp
@@ -1,22 +1,26 @@
|
|||||||
#include "pip.h"
|
#include "pip.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
const int iters = 10;
|
const int iters = 4;
|
||||||
const int sz = 100000000;
|
const int sz = 10000000;
|
||||||
{
|
|
||||||
piCout << "PIVector push back";
|
|
||||||
PIVector<int> v;
|
// {
|
||||||
//v.reserve(sz);
|
// piCout << "PIVector push back";
|
||||||
for (int n=0; n<iters; ++n) {
|
// PIVector<int> v;
|
||||||
PITimeMeasurer tm;
|
// //v.reserve(sz);
|
||||||
for (int i=0; i<sz; ++i) {
|
// for (int n=0; n<iters; ++n) {
|
||||||
v.push_back(i);
|
// PITimeMeasurer tm;
|
||||||
}
|
// for (int i=0; i<sz; ++i) {
|
||||||
piCout << tm.elapsed_m();
|
// v.push_back(i);
|
||||||
v.clear();
|
// }
|
||||||
}
|
// piCout << tm.elapsed_m() << v.capacity();
|
||||||
}
|
// v.clear();
|
||||||
|
// }
|
||||||
|
// }
|
||||||
// piCout << "\n";
|
// piCout << "\n";
|
||||||
// {
|
// {
|
||||||
// piCout << "PIVector push front";
|
// piCout << "PIVector push front";
|
||||||
@@ -27,7 +31,7 @@ int main() {
|
|||||||
// for (int i=0; i<sz; ++i) {
|
// for (int i=0; i<sz; ++i) {
|
||||||
// v.push_front(i);
|
// v.push_front(i);
|
||||||
// }
|
// }
|
||||||
// piCout << tm.elapsed_m();
|
// piCout << tm.elapsed_m() << v.capacity();
|
||||||
// v.clear();
|
// v.clear();
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
@@ -45,34 +49,36 @@ int main() {
|
|||||||
// v.clear();
|
// v.clear();
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
piCout << "\n";
|
|
||||||
{
|
|
||||||
piCout << "PIDeque push back";
|
// piCout << "\n";
|
||||||
PIDeque<int> v;
|
// {
|
||||||
//v.reserve(sz);
|
// piCout << "PIDeque push back";
|
||||||
for (int n=0; n<iters; ++n) {
|
// PIDeque<int> v;
|
||||||
PITimeMeasurer tm;
|
// //v.reserve(sz);
|
||||||
for (int i=0; i<sz; ++i) {
|
// for (int n=0; n<iters; ++n) {
|
||||||
v.push_back(i);
|
// PITimeMeasurer tm;
|
||||||
}
|
// for (int i=0; i<sz; ++i) {
|
||||||
piCout << tm.elapsed_m();
|
// v.push_back(i);
|
||||||
v.clear();
|
// }
|
||||||
}
|
// piCout << tm.elapsed_m() << v.capacity();
|
||||||
}
|
// v.clear();
|
||||||
piCout << "\n";
|
// }
|
||||||
{
|
// }
|
||||||
piCout << "PIDeque push front";
|
// piCout << "\n";
|
||||||
PIDeque<int> v;
|
// {
|
||||||
//v.reserve(sz);
|
// piCout << "PIDeque push front";
|
||||||
for (int n=0; n<iters; ++n) {
|
// PIDeque<int> v;
|
||||||
PITimeMeasurer tm;
|
// //v.reserve(sz);
|
||||||
for (int i=0; i<sz; ++i) {
|
// for (int n=0; n<iters; ++n) {
|
||||||
v.push_front(i);
|
// PITimeMeasurer tm;
|
||||||
}
|
// for (int i=0; i<sz; ++i) {
|
||||||
piCout << tm.elapsed_m();
|
// v.push_front(i);
|
||||||
v.clear();
|
// }
|
||||||
}
|
// piCout << tm.elapsed_m() << v.capacity();
|
||||||
}
|
// v.clear();
|
||||||
|
// }
|
||||||
|
// }
|
||||||
// piCout << "\n";
|
// piCout << "\n";
|
||||||
// {
|
// {
|
||||||
// piCout << "PIDeque insert center";
|
// piCout << "PIDeque insert center";
|
||||||
@@ -83,21 +89,25 @@ int main() {
|
|||||||
// for (int i=0; i<sz; ++i) {
|
// for (int i=0; i<sz; ++i) {
|
||||||
// v.insert(v.size()/2, i);
|
// v.insert(v.size()/2, i);
|
||||||
// }
|
// }
|
||||||
// piCout << tm.elapsed_m();
|
// piCout << tm.elapsed_m() << v.capacity();
|
||||||
// v.clear();
|
// v.clear();
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
PIVector<llong> ind;
|
||||||
|
for (int i=0; i<sz; ++i) {
|
||||||
|
ind << randomi();
|
||||||
|
}
|
||||||
|
|
||||||
piCout << "\n";
|
piCout << "\n";
|
||||||
{
|
{
|
||||||
piCout << "Multi insert";
|
piCout << "PIMap insert back";
|
||||||
PIVector<int> v;
|
PIMap<llong, int> v;
|
||||||
PIDeque<int> v2;
|
|
||||||
//v.reserve(sz);
|
//v.reserve(sz);
|
||||||
for (int n=0; n<iters; ++n) {
|
for (int n=0; n<iters; ++n) {
|
||||||
PITimeMeasurer tm;
|
PITimeMeasurer tm;
|
||||||
for (int i=0; i<sz; ++i) {
|
for (int i=0; i<sz; ++i) {
|
||||||
v << i;
|
v[i] = i;
|
||||||
v2 << v[i];
|
|
||||||
}
|
}
|
||||||
piCout << tm.elapsed_m();
|
piCout << tm.elapsed_m();
|
||||||
v.clear();
|
v.clear();
|
||||||
@@ -105,28 +115,45 @@ int main() {
|
|||||||
}
|
}
|
||||||
piCout << "\n";
|
piCout << "\n";
|
||||||
{
|
{
|
||||||
piCout << "Multi insert 2";
|
piCout << "PIMap insert front";
|
||||||
PIVector<int> v;
|
PIMap<llong, int> v;
|
||||||
PIDeque<PIPair<int,int>> v2;
|
|
||||||
//v.reserve(sz);
|
//v.reserve(sz);
|
||||||
for (int n=0; n<iters; ++n) {
|
for (int n=0; n<iters; ++n) {
|
||||||
PITimeMeasurer tm;
|
PITimeMeasurer tm;
|
||||||
for (int i=0; i<sz; ++i) v << i;
|
for (int i=0; i<sz; ++i) {
|
||||||
for (int i=0; i<sz; ++i) v2 << PIPair<int,int>(i, v[i]);
|
v[sz - i] = i;
|
||||||
|
}
|
||||||
piCout << tm.elapsed_m();
|
piCout << tm.elapsed_m();
|
||||||
v.clear();
|
v.clear();
|
||||||
v2.clear();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
piCout << "\n";
|
||||||
|
{
|
||||||
|
piCout << "PIMap insert random";
|
||||||
|
PIMap<llong, int> v;
|
||||||
|
//v.reserve(sz);
|
||||||
|
for (int n=0; n<iters; ++n) {
|
||||||
|
PITimeMeasurer tm;
|
||||||
|
for (int i=0; i<sz; ++i) {
|
||||||
|
v[ind[i]] = i;
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_m();
|
||||||
|
v.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// piCout << "\n";
|
// piCout << "\n";
|
||||||
// {
|
// {
|
||||||
// piCout << "PIMap insert";
|
// piCout << "Multi insert";
|
||||||
// PIMap<llong, int> v;
|
// PIVector<int> v;
|
||||||
|
// PIDeque<int> v2;
|
||||||
// //v.reserve(sz);
|
// //v.reserve(sz);
|
||||||
// for (int n=0; n<iters; ++n) {
|
// for (int n=0; n<iters; ++n) {
|
||||||
// PITimeMeasurer tm;
|
// PITimeMeasurer tm;
|
||||||
// for (int i=0; i<sz; ++i) {
|
// for (int i=0; i<sz; ++i) {
|
||||||
// v.insert(i, i);
|
// v << i;
|
||||||
|
// v2 << v[i];
|
||||||
// }
|
// }
|
||||||
// piCout << tm.elapsed_m();
|
// piCout << tm.elapsed_m();
|
||||||
// v.clear();
|
// v.clear();
|
||||||
@@ -134,17 +161,20 @@ int main() {
|
|||||||
// }
|
// }
|
||||||
// piCout << "\n";
|
// piCout << "\n";
|
||||||
// {
|
// {
|
||||||
// piCout << "PIMap insert 2";
|
// piCout << "Multi insert 2";
|
||||||
// PIMap<llong, int> v;
|
// PIVector<int> v;
|
||||||
|
// PIDeque<PIPair<int,int>> v2;
|
||||||
// //v.reserve(sz);
|
// //v.reserve(sz);
|
||||||
// for (int n=0; n<iters; ++n) {
|
// for (int n=0; n<iters; ++n) {
|
||||||
// PITimeMeasurer tm;
|
// PITimeMeasurer tm;
|
||||||
// for (int i=0; i<sz; ++i) {
|
// for (int i=0; i<sz; ++i) v << i;
|
||||||
// v[i] = i;
|
// for (int i=0; i<sz; ++i) v2 << PIPair<int,int>(i, v[i]);
|
||||||
// }
|
|
||||||
// piCout << tm.elapsed_m();
|
// piCout << tm.elapsed_m();
|
||||||
// v.clear();
|
// v.clear();
|
||||||
|
// v2.clear();
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user