#include <vector>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <sys/time.h>
#include <inttypes.h>
using namespace std;
struct Big {
int data[5];
int id;
Big(int _id): id(_id){}
};
bool bigcmp(const Big& lhs, const Big& rhs) {return lhs.id > rhs.id;}
bool bigcmpm1(const Big& lhs, const Big& rhs) {return lhs.id < rhs.id;}
bool pbigcmp(const Big* lhs, const Big* rhs) {return lhs->id > rhs->id;}
bool pbigcmpm1(const Big* lhs, const Big* rhs) {return lhs->id < rhs->id;}
typedef uint64_t u64;
static u64 nsec() {
struct timeval tv;
if(gettimeofday(&tv, 0) < 0)
return -1;
return (u64)tv.tv_sec*1000*1000*1000 + tv.tv_usec*1000;
}
const u64 nsec_in_sec = 1000*1000*1000;
class stats {
double n, M2, _mean;
public:
stats():n(0),M2(0),_mean(0){}
stats& add(double x) {
n++;
double delta = x - _mean;
_mean += delta/n;
M2 += delta*(x-_mean);
return *this;
}
double mean() {return _mean;}
double stddev() {return sqrt(M2/n);}
};
int main(int, char**) {
stats p,v;
const int SZ = 500000;
vector<Big> b;
vector<Big*> pb;
for (int i=0; i<SZ; i++) {
b.push_back(Big(i));
pb.push_back(new Big(i));
}
for (int times=10; times>0; times--) {
u64 start = nsec();
sort(b.begin(), b.end(), bigcmp);
sort(b.begin(), b.end(), bigcmpm1);
v.add(nsec()-start);
}
for (int times=10; times>0; times--) {
u64 start = nsec();
sort(pb.begin(), pb.end(), pbigcmp);
sort(pb.begin(), pb.end(), pbigcmpm1);
p.add(nsec()-start);
}
cout << "By value " << v.mean()/nsec_in_sec << " sec std "
<< v.stddev()/nsec_in_sec << " sec" << endl;
cout << "By pointer " << p.mean()/nsec_in_sec << " sec std "
<< p.stddev()/nsec_in_sec << " sec" << endl;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxzeXMvdGltZS5oPgojaW5jbHVkZSA8aW50dHlwZXMuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgQmlnIHsKICAgIGludCBkYXRhWzVdOwogICAgaW50IGlkOwogICAgQmlnKGludCBfaWQpOiBpZChfaWQpe30KfTsKCmJvb2wgYmlnY21wKGNvbnN0IEJpZyYgbGhzLCBjb25zdCBCaWcmIHJocykge3JldHVybiBsaHMuaWQgPiByaHMuaWQ7fQpib29sIGJpZ2NtcG0xKGNvbnN0IEJpZyYgbGhzLCBjb25zdCBCaWcmIHJocykge3JldHVybiBsaHMuaWQgPCByaHMuaWQ7fQpib29sIHBiaWdjbXAoY29uc3QgQmlnKiBsaHMsIGNvbnN0IEJpZyogcmhzKSB7cmV0dXJuIGxocy0+aWQgPiByaHMtPmlkO30KYm9vbCBwYmlnY21wbTEoY29uc3QgQmlnKiBsaHMsIGNvbnN0IEJpZyogcmhzKSB7cmV0dXJuIGxocy0+aWQgPCByaHMtPmlkO30KCnR5cGVkZWYgdWludDY0X3QgdTY0OwpzdGF0aWMgdTY0IG5zZWMoKSB7CiAgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7CiAgICAgICAgaWYoZ2V0dGltZW9mZGF5KCZ0diwgMCkgPCAwKQogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIHJldHVybiAodTY0KXR2LnR2X3NlYyoxMDAwKjEwMDAqMTAwMCArIHR2LnR2X3VzZWMqMTAwMDsKfQoKY29uc3QgdTY0IG5zZWNfaW5fc2VjID0gMTAwMCoxMDAwKjEwMDA7CmNsYXNzIHN0YXRzIHsKICAgICAgICBkb3VibGUgbiwgTTIsIF9tZWFuOwpwdWJsaWM6CiAgICAgICAgc3RhdHMoKTpuKDApLE0yKDApLF9tZWFuKDApe30KICAgICAgICBzdGF0cyYgYWRkKGRvdWJsZSB4KSB7CiAgICAgICAgICAgICAgICBuKys7CiAgICAgICAgICAgICAgICBkb3VibGUgZGVsdGEgPSB4IC0gX21lYW47CiAgICAgICAgICAgICAgICBfbWVhbiArPSBkZWx0YS9uOwogICAgICAgICAgICAgICAgTTIgKz0gZGVsdGEqKHgtX21lYW4pOwogICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOwogICAgICAgIH0KICAgICAgICBkb3VibGUgbWVhbigpIHtyZXR1cm4gX21lYW47fQogICAgICAgIGRvdWJsZSBzdGRkZXYoKSB7cmV0dXJuIHNxcnQoTTIvbik7fQp9OwoKCmludCBtYWluKGludCwgY2hhcioqKSB7CiAgICBzdGF0cyBwLHY7CiAgICBjb25zdCBpbnQgU1ogPSA1MDAwMDA7CiAgICB2ZWN0b3I8QmlnPiBiOwogICAgdmVjdG9yPEJpZyo+IHBiOwogICAgZm9yIChpbnQgaT0wOyBpPFNaOyBpKyspIHsKICAgICAgICBiLnB1c2hfYmFjayhCaWcoaSkpOwogICAgICAgIHBiLnB1c2hfYmFjayhuZXcgQmlnKGkpKTsKICAgIH0KICAgIGZvciAoaW50IHRpbWVzPTEwOyB0aW1lcz4wOyB0aW1lcy0tKSB7CiAgICAgICAgdTY0IHN0YXJ0ID0gbnNlYygpOwogICAgICAgIHNvcnQoYi5iZWdpbigpLCBiLmVuZCgpLCBiaWdjbXApOwogICAgICAgIHNvcnQoYi5iZWdpbigpLCBiLmVuZCgpLCBiaWdjbXBtMSk7CiAgICAgICAgdi5hZGQobnNlYygpLXN0YXJ0KTsKICAgIH0KICAgIGZvciAoaW50IHRpbWVzPTEwOyB0aW1lcz4wOyB0aW1lcy0tKSB7CiAgICAgICAgdTY0IHN0YXJ0ID0gbnNlYygpOwogICAgICAgIHNvcnQocGIuYmVnaW4oKSwgcGIuZW5kKCksIHBiaWdjbXApOwogICAgICAgIHNvcnQocGIuYmVnaW4oKSwgcGIuZW5kKCksIHBiaWdjbXBtMSk7CiAgICAgICAgcC5hZGQobnNlYygpLXN0YXJ0KTsKICAgIH0KICAgIGNvdXQgPDwgIkJ5IHZhbHVlICAgIiA8PCB2Lm1lYW4oKS9uc2VjX2luX3NlYyA8PCAiIHNlYyBzdGQgIiAKICAgICAgICA8PCB2LnN0ZGRldigpL25zZWNfaW5fc2VjIDw8ICIgc2VjIiA8PCBlbmRsOwogICAgY291dCA8PCAiQnkgcG9pbnRlciAiIDw8IHAubWVhbigpL25zZWNfaW5fc2VjIDw8ICIgc2VjIHN0ZCAiIAogICAgICAgIDw8IHAuc3RkZGV2KCkvbnNlY19pbl9zZWMgPDwgIiBzZWMiIDw8IGVuZGw7Cn0K