optimize piSwap and c++11 improvments
This commit is contained in:
@@ -538,5 +538,7 @@ inline PICout operator <<(PICout s, const PIDeque<T> & v) {
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T> inline void piSwap(PIDeque<T> & f, PIDeque<T> & s) {f.swap(s);}
|
||||||
|
|
||||||
|
|
||||||
#endif // PIDEQUE_H
|
#endif // PIDEQUE_H
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ void piQuickSort(T * a, ssize_t N) {
|
|||||||
if (i <= j) {
|
if (i <= j) {
|
||||||
if (i != j) {
|
if (i != j) {
|
||||||
//piCout << "swap" << i << j << a[i] << a[j];
|
//piCout << "swap" << i << j << a[i] << a[j];
|
||||||
piSwapBinary<T>(a[i], a[j]);
|
piSwap<T>(a[i], a[j]);
|
||||||
}
|
}
|
||||||
i++; j--;
|
i++; j--;
|
||||||
}
|
}
|
||||||
@@ -216,8 +216,8 @@ public:
|
|||||||
PIMap<Key, T> & clear() {pim_content.clear(); pim_index.clear(); return *this;}
|
PIMap<Key, T> & clear() {pim_content.clear(); pim_index.clear(); return *this;}
|
||||||
|
|
||||||
void swap(PIMap<Key, T> & other) {
|
void swap(PIMap<Key, T> & other) {
|
||||||
piSwapBinary<PIVector<T> >(pim_content, other.pim_content);
|
pim_content.swap(other.pim_content);
|
||||||
piSwapBinary<PIDeque<MapIndex> >(pim_index, other.pim_index);
|
pim_index.swap(other.pim_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
PIMap<Key, T> & insert(const Key & key, const T & value) {
|
PIMap<Key, T> & insert(const Key & key, const T & value) {
|
||||||
@@ -292,7 +292,7 @@ protected:
|
|||||||
pim_index[i].index = ci;
|
pim_index[i].index = ci;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
piSwapBinary<T>(pim_content[ci], pim_content.back());
|
piSwap<T>(pim_content[ci], pim_content.back());
|
||||||
pim_content.resize(pim_index.size());
|
pim_content.resize(pim_index.size());
|
||||||
}
|
}
|
||||||
const value_type _pair(ssize_t index) const {
|
const value_type _pair(ssize_t index) const {
|
||||||
@@ -342,5 +342,7 @@ inline PICout operator <<(PICout s, const PIMap<Key, Type> & v) {
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename Key, typename Type> inline void piSwap(PIMap<Key, Type> & f, PIMap<Key, Type> & s) {f.swap(s);}
|
||||||
|
|
||||||
|
|
||||||
#endif // PIMAP_H
|
#endif // PIMAP_H
|
||||||
|
|||||||
@@ -487,5 +487,7 @@ inline PICout operator <<(PICout s, const PIVector<T> & v) {
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T> inline void piSwap(PIVector<T> & f, PIVector<T> & s) {f.swap(s);}
|
||||||
|
|
||||||
|
|
||||||
#endif // PIVECTOR_H
|
#endif // PIVECTOR_H
|
||||||
|
|||||||
@@ -255,9 +255,15 @@ typedef unsigned long long ullong;
|
|||||||
typedef long long llong;
|
typedef long long llong;
|
||||||
typedef long double ldouble;
|
typedef long double ldouble;
|
||||||
|
|
||||||
|
#ifdef PIP_CXX11_SUPPORT
|
||||||
|
#define piMove(v) std::move(v)
|
||||||
|
#else
|
||||||
|
#define piMove(v) v
|
||||||
|
#endif
|
||||||
|
|
||||||
/*! \brief Templated function for swap two values
|
/*! \brief Templated function for swap two values
|
||||||
* \details Example:\n \snippet piincludes.cpp swap */
|
* \details Example:\n \snippet piincludes.cpp swap */
|
||||||
template<typename T> inline void piSwap(T & f, T & s) {T t = f; f = s; s = t;}
|
template<typename T> inline void piSwap(T & f, T & s) {T t(piMove(f)); f = piMove(s); s = piMove(t);}
|
||||||
|
|
||||||
/*! \brief Templated function for swap two values without "="
|
/*! \brief Templated function for swap two values without "="
|
||||||
* \details Example:\n \snippet piincludes.cpp swapBinary */
|
* \details Example:\n \snippet piincludes.cpp swapBinary */
|
||||||
@@ -294,6 +300,10 @@ template<> inline void piSwapBinary(const void *& f, const void *& s) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<> inline void piSwap(double & f, double & s) {piSwapBinary<double>(f, s);}
|
||||||
|
template<> inline void piSwap(ldouble & f, ldouble & s) {piSwapBinary<ldouble>(f, s);}
|
||||||
|
|
||||||
|
|
||||||
/*! \brief Function for compare two values without "=" by raw content
|
/*! \brief Function for compare two values without "=" by raw content
|
||||||
* \details Example:\n \snippet piincludes.cpp compareBinary */
|
* \details Example:\n \snippet piincludes.cpp compareBinary */
|
||||||
inline bool piCompareBinary(const void * f, const void * s, size_t size) {
|
inline bool piCompareBinary(const void * f, const void * s, size_t size) {
|
||||||
|
|||||||
@@ -316,6 +316,7 @@ __PIBYTEARRAY_SIMPLE_TYPE__(PIChar)
|
|||||||
|
|
||||||
|
|
||||||
template<> inline uint piHash(const PIByteArray & ba) {return ba.hash();}
|
template<> inline uint piHash(const PIByteArray & ba) {return ba.hash();}
|
||||||
|
template<> inline void piSwap(PIByteArray & f, PIByteArray & s) {f.swap(s);}
|
||||||
|
|
||||||
|
|
||||||
#endif // PIBYTEARRAY_H
|
#endif // PIBYTEARRAY_H
|
||||||
|
|||||||
@@ -504,13 +504,19 @@ public:
|
|||||||
explicit PIObject(const PIString & name = PIString());
|
explicit PIObject(const PIString & name = PIString());
|
||||||
|
|
||||||
virtual ~PIObject();
|
virtual ~PIObject();
|
||||||
|
|
||||||
|
#ifdef PIP_CXX11_SUPPORT
|
||||||
|
explicit PIObject(const PIObject & ) = delete;
|
||||||
|
void operator =(const PIObject & ) = delete;
|
||||||
|
#else
|
||||||
private:
|
private:
|
||||||
explicit PIObject(const PIObject & );
|
explicit PIObject(const PIObject & );
|
||||||
void operator =(const PIObject & );
|
void operator =(const PIObject & );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
private:
|
||||||
uint _signature_;
|
uint _signature_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
//! Returns object name
|
//! Returns object name
|
||||||
|
|||||||
@@ -770,5 +770,6 @@ PIString versionNormalize(const PIString & v);
|
|||||||
|
|
||||||
|
|
||||||
template<> inline uint piHash(const PIString & s) {return s.hash();}
|
template<> inline uint piHash(const PIString & s) {return s.hash();}
|
||||||
|
template<> inline void piSwap(PIString & f, PIString & s) {f.swap(s);}
|
||||||
|
|
||||||
#endif // PISTRING_H
|
#endif // PISTRING_H
|
||||||
|
|||||||
201
main.cpp
201
main.cpp
@@ -110,27 +110,196 @@ private:
|
|||||||
|
|
||||||
};
|
};
|
||||||
*/
|
*/
|
||||||
|
struct A {
|
||||||
|
double arr[1000];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
//PIKbdListener kbd(0, 0, false);
|
//PIKbdListener kbd(0, 0, false);
|
||||||
|
|
||||||
|
void swap(int & x, int & y) {int t = x; x = y; y = t;}
|
||||||
|
void swap2(int & x, int & y) {int t(std::move(x)); x = y; y = t;}
|
||||||
|
void swap(size_t & x, size_t & y) {size_t t = x; x = y; y = t;}
|
||||||
|
void swap2(size_t & x, size_t & y) {size_t t{std::move(x)}; x = y; y = t;}
|
||||||
|
void swap(double & x, double & y) {double t = x; x = y; y = t;}
|
||||||
|
void swap2(double & x, double & y) {double t(std::move(x)); x = std::move(y); y = std::move(t);}
|
||||||
|
void swap(float & x, float & y) {float t = x; x = y; y = t;}
|
||||||
|
void swap2(float & x, float & y) {float t(std::move(x)); x = std::move(y); y = std::move(t);}
|
||||||
|
void swap(PIString & x, PIString & y) {PIString t = x; x = y; y = t;}
|
||||||
|
void swap2(PIString & x, PIString & y) {PIString t(std::move(x)); x = std::move(y); y = std::move(t);}
|
||||||
|
void swap(std::string & x, std::string & y) {std::string t = x; x = y; y = t;}
|
||||||
|
void swap2(std::string & x, std::string & y) {std::string t{std::move(x)}; x = std::move(y); y = std::move(t);}
|
||||||
|
void swap(A & x, A & y) {A t = x; x = y; y = t;}
|
||||||
|
void swap2(A & x, A & y) {A t{std::move(x)}; x = std::move(y); y = std::move(t);}
|
||||||
|
void swap(PIObject & x, PIObject & y) {A t = x; x = y; y = t;}
|
||||||
|
//void swap2(PIObject & x, PIObject & y) {A t(std::move(x)); x = std::move(y); y = std::move(t);}
|
||||||
|
|
||||||
#include "pigpio.h"
|
|
||||||
int main(int argc, char * argv[]) {
|
int main(int argc, char * argv[]) {
|
||||||
PIObject * o = PIIODevice::createFromFullPath("ser://COM1");
|
PITimeMeasurer tm;
|
||||||
piCout << o;
|
int m = 100000;
|
||||||
piCout << o->cast<PIIODevice>();
|
int a = 99, b = 77;
|
||||||
piCout << o->cast<PISerial>();
|
piCout << "int";
|
||||||
piCout << o->scopeList();
|
tm.reset();
|
||||||
piCout << "\n\n";
|
for (int i = 0; i < m; ++i) {
|
||||||
PIMap<uint, PIObject::__MetaData> & m(PIObject::__meta_data());
|
swap(a,b);
|
||||||
for (auto it = m.constBegin(); it != m.constEnd(); ++it) {
|
}
|
||||||
const PIObject::__MetaData & md(it.value());
|
piCout << tm.elapsed_s(); tm.reset();
|
||||||
piCout << it.key() << md.scope_list << md.scope_id << ":";
|
for (int i = 0; i < m; ++i) {
|
||||||
for (auto j = md.eh_func.constBegin(); j != md.eh_func.constEnd(); ++j) {
|
swap2(a,b);
|
||||||
piCout << " " << j.value().fullFormat();
|
}
|
||||||
}
|
piCout << tm.elapsed_s(); tm.reset();
|
||||||
piCout << "";
|
for (int i = 0; i < m; ++i) {
|
||||||
}/**/
|
piSwapBinary(a,b);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s(); tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
piSwap(a,b);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s();
|
||||||
|
|
||||||
|
piCout << "size_t";
|
||||||
|
size_t ta = 99, tb = 77;
|
||||||
|
tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
swap(ta,tb);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s(); tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
swap2(ta,tb);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s(); tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
piSwapBinary(ta,tb);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s(); tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
piSwap(ta,tb);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s();
|
||||||
|
|
||||||
|
piCout << "ullong";
|
||||||
|
ullong lla = 99, llb = 77;
|
||||||
|
tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
swap(lla,llb);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s(); tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
swap2(lla,llb);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s(); tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
piSwapBinary(lla,llb);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s(); tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
piSwap(lla,llb);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s();
|
||||||
|
|
||||||
|
piCout << "double";
|
||||||
|
double da = 0.99,db = 77.77;
|
||||||
|
tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
swap(da,db);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s(); tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
swap2(da,db);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s(); tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
piSwapBinary(da,db);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s(); tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
piSwap(da,db);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s();
|
||||||
|
|
||||||
|
piCout << "float";
|
||||||
|
float fa = 0.99,fb = 77.77;
|
||||||
|
tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
swap(fa,fb);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s(); tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
swap2(fa,fb);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s(); tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
piSwapBinary(fa,fb);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s(); tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
piSwap(fa,fb);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s();
|
||||||
|
|
||||||
|
piCout << "A";
|
||||||
|
A aa,ab;
|
||||||
|
tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
swap(aa,ab);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s(); tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
swap2(aa,ab);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s(); tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
piSwapBinary(aa,ab);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s(); tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
piSwap(aa,ab);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s();
|
||||||
|
|
||||||
|
piCout << "std::string";
|
||||||
|
std::string ia = "123456789012345678901vfsdvsd2345678",ib = "qwertyvsdfvvsdvfsuiopqwertyuikolsdfghjklsdfghjk";
|
||||||
|
tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
swap(ia,ib);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s(); tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
swap2(ia,ib);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s(); tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
ia.swap(ib);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s(); tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
piSwap(ia,ib);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s();
|
||||||
|
|
||||||
|
|
||||||
|
PIString sa = "123456789012345678901vfsdvsd2345678",sb = "qwertyvsdfvvsdvfsuiopqwertyuikolsdfghjklsdfghjk";
|
||||||
|
piCout << "PIString";
|
||||||
|
tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
swap(sa,sb);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s(); tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
swap2(sa, sb);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s(); tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
sa.swap(sb);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s(); tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
piSwapBinary(sa, sb);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s(); tm.reset();
|
||||||
|
for (int i = 0; i < m; ++i) {
|
||||||
|
piSwap(sa, sb);
|
||||||
|
}
|
||||||
|
piCout << tm.elapsed_s();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user