1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | #include <ctime> #include <chrono> #include <ostream> #include <iostream> #include <string> #include <vector> #include <algorithm> class StopWatch { public: struct Process { Process(std::string name, double time) :process_name(std::move(name)), running_time(time) {} std::string process_name; double running_time; }; StopWatch() :running_(false) {} void Start(const std::string & process) { if (running_) Stop(); current_process_ = process; running_ = true; start_time_ = std::chrono::system_clock::now(); } void Stop() { if (!running_) return; auto now = std::chrono::system_clock::now(); std::chrono::duration<double> duration = now - start_time_; processes_.emplace_back( std::move(current_process_), duration.count()); running_ = false; } static double SystemClockSeconds() { return (double)clock() / CLOCKS_PER_SEC; } double operator[] (const std::string & process) const { auto it = std::find_if( processes_.begin(), processes_.end(), [&](const Process & p) { return p.process_name == process; }); if (it != processes_.end()) return it->running_time; return 0.0; } Process operator[](int index) const { return processes_[index]; } int size() const { return processes_.size(); } private: bool running_; std::string current_process_; std::chrono::system_clock::time_point start_time_; std::vector<Process> processes_; }; std::ostream & operator<<( std::ostream & os, const StopWatch & watch) { for (int i=0; i<watch.size(); ++i) os << watch[i].process_name << " : " << watch[i].running_time << "s\n"; return os; } int main() { const int sz = 1000000; std::vector<long long> src; std::vector<long long> vi; std::vector<long long*> vp; for (int i=0; i<sz; ++i) { int x = rand(); src.push_back(x); vi.push_back(x); } for (int i=0; i<sz; ++i) { vp.push_back(&src[i]); } StopWatch watch; watch.Start("integers"); std::sort(vi.begin(), vi.end(), [](long long lhs, long long rhs) { return lhs < rhs; }); watch.Stop(); watch.Start("pointers"); std::sort(vp.begin(), vp.end(), [](long long * lhs, long long * rhs) { return *lhs < *rhs; }); watch.Stop(); std::cout << watch; } |
I2luY2x1ZGUgPGN0aW1lPgojaW5jbHVkZSA8Y2hyb25vPgojaW5jbHVkZSA8b3N0cmVhbT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKY2xhc3MgU3RvcFdhdGNoCnsKcHVibGljOgoJc3RydWN0IFByb2Nlc3MKCXsKCQlQcm9jZXNzKHN0ZDo6c3RyaW5nIG5hbWUsIGRvdWJsZSB0aW1lKQoJCQk6cHJvY2Vzc19uYW1lKHN0ZDo6bW92ZShuYW1lKSksCgkJCXJ1bm5pbmdfdGltZSh0aW1lKQoJCXt9CgkJCgkJc3RkOjpzdHJpbmcgcHJvY2Vzc19uYW1lOwoJCWRvdWJsZSBydW5uaW5nX3RpbWU7Cgl9OwoJCglTdG9wV2F0Y2goKQoJCTpydW5uaW5nXyhmYWxzZSkKCXt9CgoJdm9pZCBTdGFydChjb25zdCBzdGQ6OnN0cmluZyAmIHByb2Nlc3MpCgl7CgkJaWYgKHJ1bm5pbmdfKQoJCQlTdG9wKCk7CgkJY3VycmVudF9wcm9jZXNzXyA9IHByb2Nlc3M7CgkJcnVubmluZ18gPSB0cnVlOwoJCXN0YXJ0X3RpbWVfID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7Cgl9CgkKCXZvaWQgU3RvcCgpCgl7CgkJaWYgKCFydW5uaW5nXykKCQkJcmV0dXJuOwoJCWF1dG8gbm93ID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CgkJc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4gZHVyYXRpb24gPSBub3cgLSBzdGFydF90aW1lXzsKCQlwcm9jZXNzZXNfLmVtcGxhY2VfYmFjaygKCQkJc3RkOjptb3ZlKGN1cnJlbnRfcHJvY2Vzc18pLCBkdXJhdGlvbi5jb3VudCgpKTsKCQlydW5uaW5nXyA9IGZhbHNlOwoJfQoJCglzdGF0aWMgZG91YmxlIFN5c3RlbUNsb2NrU2Vjb25kcygpCgl7CgkJCgkJcmV0dXJuIChkb3VibGUpY2xvY2soKSAvIENMT0NLU19QRVJfU0VDOwoJfQoJCglkb3VibGUgb3BlcmF0b3JbXSAoY29uc3Qgc3RkOjpzdHJpbmcgJiBwcm9jZXNzKSBjb25zdAoJewoJCWF1dG8gaXQgPSBzdGQ6OmZpbmRfaWYoCgkJCXByb2Nlc3Nlc18uYmVnaW4oKSwgcHJvY2Vzc2VzXy5lbmQoKSwKCQkJWyZdKGNvbnN0IFByb2Nlc3MgJiBwKSB7CgkJCQlyZXR1cm4gcC5wcm9jZXNzX25hbWUgPT0gcHJvY2VzczsKCQkJfSk7CgkJCQoJCWlmIChpdCAhPSBwcm9jZXNzZXNfLmVuZCgpKQoJCQlyZXR1cm4gaXQtPnJ1bm5pbmdfdGltZTsKCQlyZXR1cm4gMC4wOwoJfQoJCglQcm9jZXNzIG9wZXJhdG9yW10oaW50IGluZGV4KSBjb25zdCB7CgkJcmV0dXJuIHByb2Nlc3Nlc19baW5kZXhdOwoJfQoJCglpbnQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHByb2Nlc3Nlc18uc2l6ZSgpOyB9CnByaXZhdGU6Cglib29sIHJ1bm5pbmdfOwoJc3RkOjpzdHJpbmcgY3VycmVudF9wcm9jZXNzXzsKCXN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRpbWVfcG9pbnQgc3RhcnRfdGltZV87CglzdGQ6OnZlY3RvcjxQcm9jZXNzPiBwcm9jZXNzZXNfOwkJCn07CgpzdGQ6Om9zdHJlYW0gJiBvcGVyYXRvcjw8KAoJc3RkOjpvc3RyZWFtICYgb3MsIGNvbnN0IFN0b3BXYXRjaCAmIHdhdGNoKQp7Cglmb3IgKGludCBpPTA7IGk8d2F0Y2guc2l6ZSgpOyArK2kpCgkJb3MgPDwgd2F0Y2hbaV0ucHJvY2Vzc19uYW1lIDw8ICIgOiAiCgkJICAgPDwgd2F0Y2hbaV0ucnVubmluZ190aW1lIDw8ICJzXG4iOwoJcmV0dXJuIG9zOwp9CgppbnQgbWFpbigpCnsKCWNvbnN0IGludCBzeiA9IDEwMDAwMDA7CglzdGQ6OnZlY3Rvcjxsb25nIGxvbmc+IHNyYzsKCXN0ZDo6dmVjdG9yPGxvbmcgbG9uZz4gdmk7CglzdGQ6OnZlY3Rvcjxsb25nIGxvbmcqPiB2cDsKCQoJZm9yIChpbnQgaT0wOyBpPHN6OyArK2kpCgl7CgkJaW50IHggPSByYW5kKCk7CgkJc3JjLnB1c2hfYmFjayh4KTsKCQl2aS5wdXNoX2JhY2soeCk7Cgl9CgkKCWZvciAoaW50IGk9MDsgaTxzejsgKytpKQoJewoJCXZwLnB1c2hfYmFjaygmc3JjW2ldKTsKCX0KCQoJU3RvcFdhdGNoIHdhdGNoOwoJd2F0Y2guU3RhcnQoImludGVnZXJzIik7CglzdGQ6OnNvcnQodmkuYmVnaW4oKSwgdmkuZW5kKCksCgkgICAgW10obG9uZyBsb25nIGxocywgbG9uZyBsb25nIHJocykgewoJCQlyZXR1cm4gbGhzIDwgcmhzOwoJCX0pOwoJd2F0Y2guU3RvcCgpOwoJCgl3YXRjaC5TdGFydCgicG9pbnRlcnMiKTsKCXN0ZDo6c29ydCh2cC5iZWdpbigpLCB2cC5lbmQoKSwKCSAgICBbXShsb25nIGxvbmcgKiBsaHMsIGxvbmcgbG9uZyAqIHJocykgewoJCQlyZXR1cm4gKmxocyA8ICpyaHM7CgkJfSk7Cgl3YXRjaC5TdG9wKCk7CgkKCXN0ZDo6Y291dCA8PCB3YXRjaDsKfQ==
-
upload with new input
-
result: Success time: 0.58s memory: 3024 kB returned value: 0
integers : 0.129414s pointers : 0.375247s


